c++ c debugging gdb breakpoints

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



debugging breakpoints (12)

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>


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?


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)


¿Alguna otra idea? tengo

warning: Current output protocol does not support redirection

después

set logging on

EDITAR:

Sé que la pregunta es "cómo guardar una lista de puntos de interrupción", pero acabo de descubrir que con gdb podemos simplemente establecer los puntos de interrupción "guardados en un archivo"

gdb> source breakpoints.txt

donde breakpoints.txt es un archivo como este:

break main.cpp:25 break engine.cpp:465 break wheel.cpp:57


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.


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.


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.



Sé que este es un hilo viejo, pero apareció en mi búsqueda de Google para ayudarme a hacer esto. Soy nuevo en gdb y encontré la siguiente adición a la respuesta anterior útil para guardar / cargar los puntos de interrupción en un archivo específico.

  • Guardar puntos de interrupción: bsave {filename}
  • Cargar puntos de interrupción: bload {filename}

Como arriba, agregue el siguiente código al archivo ~ / .gdbinit

#Save breakpoints to a file define bsave if $argc != 1 help bsave else save breakpoints $arg0 end end document bsave Saves all current defined breakpoints to the defined file in the PWD Usage: bsave <filename> end #Loads breakpoints from a file define bload if $argc != 1 help bload else source $arg0 end end document bload Loads all breakpoints from the defined file in the PWD Usage: bload <filename> end


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


Esta respuesta no está actualizada, gdb ahora admite el guardado directamente. Vea esta respuesta .

Puedes usar el registro:

(gdb) b main Breakpoint 1 at 0x8049329 (gdb) info break Num Type Disp Enb Address What 1 breakpoint keep y 0x08049329 <main+16> (gdb) set logging file breaks.txt (gdb) set logging on Copying output to breaks.txt. (gdb) info break Num Type Disp Enb Address What 1 breakpoint keep y 0x08049329 <main+16> (gdb) q

El archivo breaks.txt ahora contiene:

Num Type Disp Enb Address What 1 breakpoint keep y 0x08049329 <main+16>

Escribir un script awk que lo transforme en un formato útil para .gdbinit o un archivo de --command es fácil. O incluso puede hacer que el script emita --eval-command separados para la línea de comando de gdb ...

Agregar esta pequeña macro a .gdbinit te ayudará a hacerlo:

# call with dump_breaks file.txt define dump_breaks set logging file $arg0 set logging redirect on set logging on info breakpoints set logging off set logging redirect off end