2012-08-22 12 views
11

In GDB debugging codice C++: ho impostato 15 punti di interruzione in modo strategico, ma non desidero che vengano attivati ​​fino a quando non ho raggiunto il punto di interruzione n. 2. C'è un comando fino al punto di interruzione- n in GDB?GDB: esecuzione fino a breakpoint specifico

mi ritrovo a fare una delle due cose: invece

  1. Eliminare tutti gli altri punti di interruzione in modo che 2 # è tutto ciò che esiste, RUN, aggiungere nuovamente tutti i punti di interruzione; oppure

  2. Esegui e ripetutamente continue dopo tutte le interruzioni fino a quando non vedo la prima interruzione in # 2.

voglio qualcosa di simile run-until 2 che ignorerà tutti gli altri punti di interruzione, ad eccezione # 2, ma non li elimina. Questo esiste? Qualcun altro ha un modo migliore per affrontare questo?

risposta

11

A partire dalla versione 7.0 GDB supporta lo scripting python. Ho scritto un semplice script che disabiliterà temporaneamente tutti i breakpoint abilitati tranne quello con numero specificato ed eseguirà il comando GDB run.

Aggiungere il seguente codice al file .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

Grande, questo è molto utile (e hackerabile). Grazie alex! – sligocki

+0

Questo è fantastico. A 'continue-until 'la versione sarebbe probabilmente più utile. –

3

Un po 'meno doloroso dell'eliminazione di tutti gli altri punti di interruzione è disable. In questo modo non devi reimmettere tutte le cose associate al punto di interruzione per riportarlo indietro, solo enable di nuovo in base al numero.

2

Con gdb i punti di interruzione possono essere disabilitati anziché eliminati. Quindi tutto ciò che devi fare è riattivarli quando necessario.

11

È possibile i punti di interruzione enable e disable e questi comandi accettano un intervallo . Utilizzare questi comandi, con un intervallo, in punti strategici durante l'esecuzione del programma.

Presumo che quando si menziona il punto di interruzione # 2 ci si riferisce alla numerazione gdb dei punti di interruzione. Ecco un semplice esempio sessione di 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) 

Ora solo punto di interruzione # 2 è abilitato. Eseguire il programma e quando si rompe esecuzione a 2 #, riattivare tutti i punti di interruzione desiderati con una gamma:

(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 

È inoltre possibile combinare i numeri breakpoint e varia:

(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

Grazie pb2q, non sapeva di attivazione e disattivazione. – sligocki

+0

E basta disabilitare per disabilitare tutti i punti di interruzione. –

Problemi correlati