2009-01-24 5 views
17

e vorrei sapere se esiste un modo per interrompere un programma quando si utilizza una funzione da un determinato file. Idealmente quello che sto cercando è qualcosa di simile:L'uso di gdb interrompe il programma quando utilizza qualsiasi funzione dal file X

GDB Stop when use a function from file foo.cpp 

Il motivo per fare questo è perché io sono il debug di un codice che non è mio e non so esattamente quali funzioni sono state chiamate e quali funzioni non sono. Esiste una funzione in GDB per fare ciò che sto cercando, o qualsiasi altro modo consigliato di fare qualcosa di simile ?.

Grazie

+0

Accettare: http://stackoverflow.com/a/478145/895245, fa esattamente ciò che si desidera nel GDB corrente. –

risposta

21

Fase 1: costruire un elenco di tutte le funzioni definite in foo.cpp
Il modo più semplice che posso pensare (ammesso che abbiate binutils e GNU grep):

nm a.out | grep ' T ' | addr2line -fe a.out | 
    grep -B1 'foo\.cpp' | grep -v 'foo\.cpp' > funclist 

Fase 2: costruire uno script GDB che imposterà un punto di interruzione su ciascuna delle suddette funzioni:

sed 's/^/break /' funclist > stop-in-foo.gdb 

[Ovviamente, passaggi 1 e 2 potrebbe essere combinato; -]

Fase 3: in realtà impostare i punti di interruzione:

gdb a.out 
(gdb) source stop-in-foo.gdb 

Guardando this risposta, un ancora più semplice (se siete su Fedora Linux) modo per scoprire quali funzioni foo.cpp sono chiamati:

ftrace -sym='foo.cpp#*' ./a.out 

Peccato che la pagina man ftrace non sia ancora stata implementata.

+0

stavo per dire di fare questo, ma +1 per farlo davvero. =) –

+1

Non sembra rilevare funzioni statiche. –

0

breakpoint gdb avere un paio di sintassi ... See here.

Non si romperà su qualsiasi funzione nel file anche se ....

Edit: Si potrebbe fare qualcosa stupido come fare tutte le funzioni chiama una funzione fittizia void foo (void) e breakpoint inside. Almeno ci si spezzerebbe all'interno del file, e dovrebbe essere banale trovare la funzione a fianco del file X che viene chiamata.

+0

Non è una cattiva idea la funzione foo, il fatto è che ho molti metodi e file, l'unica opzione che forse posso usare è rbreak regex. Grazie – Eduardo

2

Impiegato risposta del russo sembra molto buono, ma dal momento che dici:

Non so esattamente cosa funzioni sono stati chiamati e quali funzioni non sono .

Sarebbe un rapporto di cui sono colpiti funzioni, generato da uno strumento di copertura di codice come gcov o qualcosa che coinvolge Valgrind essere una buona soluzione al vostro problema?

1

È possibile utilizzare il comando:

break foo.cpp:function-name 
+0

Questo si interromperà solo su una funzione, ma la domanda riguarda tutte le funzioni. – Herbert

+0

'rbreak foo.cpp: .' si interromperà su tutte le funzioni da' foo.cpp' che corrispondono a regex '.' (ovvero, tutte le funzioni da' foo.cpp'). – ShreevatsaR

10

rbreak regex

Impostare i punti su tutte le funzioni corrispondenti alla regolare regex espressione.Questo comando imposta un punto di interruzione incondizionato su tutte le corrispondenze, stampando un elenco di tutti i punti di interruzione impostati. Una volta impostati questi punti di interruzione, vengono trattati come i punti di interruzione impostati con il comando break. Puoi eliminarli, disabilitarli o renderli condizionali allo stesso modo di qualsiasi altro punto di interruzione.

La sintassi dell'espressione regolare è quella standard utilizzata con strumenti come `grep '. Si noti che questo è diverso dalla sintassi utilizzata dalle shell, quindi per esempio foo * corrisponde a tutte le funzioni che includono un fo seguito da zero o più os. Esiste un implicito * che conduce e segue l'espressione regolare che fornisci, quindi per abbinare solo le funzioni che iniziano con foo, usa^pippo.

Durante il debug di programmi C++, rbreak è utile per impostare punti di interruzione su funzioni sovraccariche che non sono membri di classi speciali.

+1

Questo sembra essere migliore della risposta accettata per me :) – kizzx2

+0

Questo mi ha aiutato enormemente! Anche se suppongo che non possa essere la risposta accettata dal momento che combacia con i nomi delle funzioni e non con il nome del file in cui risiede. –

1

rbreak foo.cpp:.

Qui . corrisponde a qualsiasi cosa, e così si rompe su tutte le funzioni di file di foo.cpp.

Problemi correlati