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:
- iniciar GDB (en modo normal)
- habilitar el registro:
set logging on
; ahora no debería quejarse. - alternar entre el modo TUI y hacer cosas de GDB
- 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