2012-08-22 26 views
11

Depuración de GDB Código de C++: Tengo 15 puntos de interrupción estratégicamente establecidos, pero no quiero que ninguno de ellos se active hasta que llegue al punto de interrupción n. ° 2. ¿Hay algún comando run-until-breakpoint- n en GDB?GDB: Ejecutar hasta el punto de corte específico

me encuentro haciendo una de dos cosas en su lugar:

  1. Eliminar todos los demás nodos de manera que # 2 es todo lo que existe, correr, volver a agregar todos los puntos de interrupción; o

  2. Ejecutar y repetidamente continue después de todos los recesos hasta que vea el primer descanso en el n. ° 2.

Quiero algo así como run-until 2 que ignorar todos los demás nodos excepto # 2, pero no eliminarlos. ¿Existe esto? ¿Alguien más tiene una mejor manera de lidiar con esto?

Respuesta

11

partir de la versión 7.0 GDB es compatible con las secuencias de comandos de python. Escribí una secuencia de comandos simple que desactivará temporalmente todos los puntos de interrupción habilitados excepto el que tenga el número especificado y ejecutará el comando GDB run.

Agregue el código siguiente al archivo .gdbinit:

python 
import gdb 

class RunUntilCommand(gdb.Command): 
    """Run until breakpoint and temporary disable other ones""" 

    def __init__ (self): 
     super(RunUntilCommand, self).__init__ ("run-until", 
               gdb.COMMAND_BREAKPOINTS) 

    def invoke(self, bp_num, from_tty): 
     try: 
      bp_num = int(bp_num) 
     except (TypeError, ValueError): 
      print "Enter breakpoint number as argument." 
      return 

     all_breakpoints = gdb.breakpoints() or [] 
     breakpoints = [b for b in all_breakpoints 
         if b.is_valid() and b.enabled and b.number != bp_num and 
         b.visible == gdb.BP_BREAKPOINT] 

     for b in breakpoints: 
      b.enabled = False 

     gdb.execute("run") 

     for b in breakpoints: 
      b.enabled = True 

RunUntilCommand() 
end 
+0

Genial, esto es muy útil (y hackable). Gracias Alex! – sligocki

+0

Esto es genial. Una versión 'continue-until 'sería más útil. –

3

Un poco menos doloroso que borrar todos los otros puntos de ruptura sería disable ellos. De esta forma, no tiene que volver a ingresar todas las cosas asociadas con el punto de interrupción para devolverlo, solo enable de nuevo por número.

2

Con gdb se pueden deshabilitar los puntos de interrupción en lugar de eliminarlos. Entonces todo lo que tienes que hacer es volver a habilitarlos cuando sea necesario.

11

Puede enable y disable puntos de interrupción, y estos comandos aceptarán un rango. Use estos comandos, con un rango, en puntos estratégicos durante la ejecución del programa.

Supongo que cuando mencionas el punto de interrupción # 2 te refieres a la numeración gdb de los puntos de interrupción. Aquí hay una sesión simple de ejemplo de gdb:

(gdb) info breakpoints 
Num Type   Disp Enb Address What 
1 breakpoint  keep y 0x00001ddb in main at example.c:34 
2 breakpoint  keep y 0x00001e00 in main at example.c:39 
3 breakpoint  keep y 0x00001e15 in main at example.c:40 
(gdb) disable 1-3 
(gdb) enable 2 
(gdb) info breakpoints 
Num Type   Disp Enb Address What 
1 breakpoint  keep n 0x00001ddb in main at example.c:34 
2 breakpoint  keep y 0x00001e00 in main at example.c:39 
3 breakpoint  keep n 0x00001e15 in main at example.c:40 
(gdb) 

Ahora solo el punto de interrupción # 2 está habilitado. Ejecutar el programa y cuando se rompe la ejecución en # 2, vuelva a habilitar todos los puntos de interrupción deseada con un rango:

(gdb) enable 1-3 
(gdb) info breakpoints 
Num Type   Disp Enb Address What 
1 breakpoint  keep y 0x00001ddb in main at example.c:34 
2 breakpoint  keep y 0x00001e00 in main at example.c:39 
3 breakpoint  keep y 0x00001e15 in main at example.c:40 

También se pueden mezclar los números de punto de interrupción y rangos:

(gdb) disable 1 4 6-7 
(gdb) info breakpoints 
Num Type   Disp Enb Address What 
1 breakpoint  keep n 0x00001ddb in main at example.c:34 
2 breakpoint  keep y 0x00001e00 in main at example.c:39 
3 breakpoint  keep y 0x00001e15 in main at example.c:40 
4 breakpoint  keep n 0x00001e4f in main at example.c:43 
5 breakpoint  keep y 0x00001e4f in main at example.c:44 
6 breakpoint  keep n 0x00001e5e in main at example.c:45 
7 breakpoint  keep n 0x00001e5e in main at example.c:46 
+0

Gracias pb2q, yo no sabía nada de la activación y desactivación. – sligocki

+0

Y simplemente 'disable' para deshabilitar todos los puntos de interrupción. –

Cuestiones relacionadas