c++ - remove - Ottenere gdb per salvare un elenco di punti di interruzione?




gdb step (8)

OK, l'interruzione di informazioni elenca i punti di interruzione, ma non in un formato che funzioni bene riutilizzandoli con il comando --comando come in questa domanda . Gdb ha un metodo per scaricarli nuovamente in un file accettabile per l'input? A volte in una sessione di debug, è necessario riavviare gdb dopo aver creato una serie di punti di interruzione per il test.

Modifica: il file .gdbinit ha lo stesso problema di --command. Il comando info break non elenca i comandi, ma piuttosto una tabella per il consumo umano.

Per elaborare, ecco un esempio di interruzione di informazioni:

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

Il problema è che impostare un punto di interruzione è sensato al contesto. Cosa succede se si dispone di due funzioni statiche denominate pippo? Se stai già eseguendo il debug di uno dei moduli che definiscono foo, gdb supporrà che tu intenda quello. Ma se metti semplicemente "break foo" in un file e poi leggi quel file all'avvio, non sarà chiaro quale funzione vuoi intendere.

Non ho i punti mod per rispondere, ma quello che fai è rendere espliciti i punti di interruzione, specificando il file sorgente e il numero di riga. Se foo () è specificato in foo.c: 42 e in bar.c: 1337

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

In alternativa, specificare un breakpoint in-source che si attiva solo se il programma è in esecuzione in gdb. Vedi Come rilevare se il processo corrente è stato eseguito da GDB?


avviso: il protocollo di output corrente non supporta il reindirizzamento

Ricevo anche questo errore / avvertimento in GDB quando provo ad abilitare la registrazione in modalità TUI, tuttavia la registrazione sembra funzionare quando si è in modalità "non-TUI". Quindi lascio la modalità TUI ogni volta che voglio registrare qualcosa. (Passa avanti e indietro nella modalità TUI con CTRL-X , CTRL-A ).

Ecco come lavoro:

  1. avvia GDB (in modalità normale)
  2. abilita la registrazione: set logging on - ora non dovrebbe lamentarsi.
  3. passare indietro / avanti in modalità TUI e fare cose GDB
  4. ogni volta che voglio registrare qualcosa (come un enorme dump backtrace) - passare alla modalità normale

Spero che questo aiuti, / M: o)


Altre idee? Io ho

warning: Current output protocol does not support redirection

dopo

set logging on

MODIFICARE:

So che la domanda è "come salvare un elenco di punti di interruzione", tuttavia ho appena scoperto che con gdb possiamo semplicemente impostare i punti di interruzione "salvati nel file" di

gdb> source breakpoints.txt

dove breakpoints.txt è un file come questo:

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

Estensione alla risposta di Johannes: è possibile riformattare automaticamente l'output dell'interruzione delle info break in un file di comando gdb valido:

.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

Successivamente hai un file di brestore.gdb valido in brestore.gdb

Questo ha funzionato per me quando l'applicazione è compilata con -g .

EDIT : testato con successo con gdb v6.8 su Ubuntu Karmic.


Il problema è che impostare un punto di interruzione è sensato al contesto. Cosa succede se si dispone di due funzioni statiche denominate pippo? Se stai già eseguendo il debug di uno dei moduli che definiscono foo, gdb supporrà che tu intenda quello. Ma se metti semplicemente "break foo" in un file e poi leggi quel file all'avvio, non sarà chiaro quale funzione vuoi intendere.


Metti i tuoi comandi gdb e i punti di interruzione in un file .gdbinit così come potresti scriverli al prompt gdb>, e gdb li caricherà automaticamente ed eseguirli all'avvio. Questo è un file per directory, quindi puoi avere file diversi per progetti diversi.


Un'estensione all'estensione di anon alla risposta di 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 è quindi possibile ripristinare i punti di interruzione salvati con bsave .


metti il ​​seguente in ~ / .gdbinit per definire bsave e brestore come comandi gdb per salvare e ripristinare i breakpoint.

define bsave
    save breakpoints ~/.breakpoints
end

define brestore
   source ~/.breakpoints
end




breakpoints