c++ - Obtener gdb para guardar una lista de puntos de interrupción?




debugging breakpoints (8)

El problema es que establecer un punto de interrupción es sensible al contexto. ¿Qué pasa si tienes dos funciones estáticas llamadas foo? Si ya está depurando uno de los módulos que define a foo, entonces gdb supondrá que lo dijo en serio. Pero si solo volcas "break foo" en un archivo y luego lees ese archivo al inicio, no estará claro a qué función te refieres.

No tengo los puntos mod para responder, pero lo que debes hacer es hacer que tus puntos de interrupción sean explícitos, especificando el archivo fuente y el número de línea. Si foo () se especifica en foo.c: 42 y en bar.c: 1337

break foo.c:42
break bar.c:1337

Alternativamente, especifique un punto de interrupción en la fuente que solo se active si el programa se ejecuta bajo gdb. Consulte ¿Cómo detectar si el proceso actual está siendo ejecutado por GDB?

OK, el salto de información enumera los puntos de corte, pero no en un formato que funcione bien al reutilizarlos usando el comando --como en esta pregunta . ¿Tiene gdb un método para volcarlos en un archivo aceptable para entrada? A veces, en una sesión de depuración, es necesario reiniciar gdb después de crear un conjunto de puntos de interrupción para la prueba.

Editar: el archivo .gdbinit tiene el mismo problema que --command. El comando de interrupción de información no muestra comandos, sino una tabla para el consumo humano.

Para elaborar, aquí hay una muestra del salto de información:

(gdb) info break
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x08048517 <foo::bar(void)+7>

advertencia: el protocolo de salida actual no admite la redirección

También recibo este error / advertencia en GDB cuando intento habilitar el registro en modo TUI, sin embargo, el registro parece funcionar cuando está en modo "no TUI". Así que dejo el modo TUI cada vez que quiero registrar algo. (Alterna entre el modo TUI con CTRL-X , CTRL-A ).

Así es como trabajo:

  1. iniciar GDB (en modo normal)
  2. habilitar el registro: set logging on ; ahora no debería quejarse.
  3. alternar entre el modo TUI y hacer cosas de GDB
  4. siempre que quiera registrar algo (como un volcado enorme de rastreo) - alternar al modo normal

Espero que esto ayude, / M: o)


A partir de gdb 7.2, ahora puede usar el comando save breakpoints.

save breakpoints <filename>
  Save all current breakpoint definitions to a file suitable for use
  in a later debugging session.  To read the saved breakpoint
  definitions, use the `source' command.

Coloque los comandos y puntos de corte de gdb en un archivo .gdbinit del mismo modo que los podría escribir en el indicador gdb>, y gdb los cargará y ejecutará automáticamente al inicio. Este es un archivo por directorio, por lo que puede tener diferentes archivos para diferentes proyectos.


Extensión de la respuesta de Johannes: se puede volver a formatear automáticamente la salida del info break de info break en un archivo de comando gdb válido:

.gdbinit:

define bsave
   shell rm -f brestore.txt
   set logging file brestore.txt
   set logging on
   info break
   set logging off
   # reformat on-the-fly to a valid gdb command file
   shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end 
document bsave
  store actual breakpoints
end

Luego tiene un archivo de brestore.gdb válido en brestore.gdb

Esto funcionó para mí cuando la aplicación se compila con -g .

EDIT : probado con éxito con gdb v6.8 en Ubuntu Karmic.



Una extensión de la extensión de anon a la respuesta de Johannes:

.gdbinit:

define bsave
    shell rm -f brestore.txt
    set logging file brestore.txt
    set logging on
    info break
    set logging off
    # reformat on-the-fly to a valid gdb command file
    shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end 
document bsave
  store actual breakpoints
end

define brestore
  source brestore.gdb
end
document brestore
  restore breakpoints saved by bsave
end

Con brestore puede restaurar los puntos de interrupción guardados con bsave .


ponga lo siguiente en ~ / .gdbinit para definir bsave y brestore como comandos gdb para guardar y restaurar puntos de interrupción.

define bsave
    save breakpoints ~/.breakpoints
end

define brestore
   source ~/.breakpoints
end




breakpoints