2012-11-16 15 views
9

C'è un modo per impostare un punto di interruzione su ogni riga nel codice con GDB? Ovviamente non voglio colpire b *addr per ogni singola riga, quindi mi chiedo se c'è un modo veloce per farlo.Imposta punto di interruzione su ogni riga in GDB

Modifica Nota che eseguo un binario creato da qualcun altro e non ho accesso al codice sorgente. Sfortunatamente, quel file binario non è stato compilato con il flag -g. Pertanto, non posso semplicemente eseguire un singolo passaggio attraverso ogni riga del codice.

Ulteriori Modifica Come Jason sottolinea qui di seguito, è possibile infatti solo passo attraverso il codice fino a quando si utilizza si o ni, piuttosto che semplicemente semplicemente s (passo) o n (successivo). n o s funzionano bene, però, se il codice sorgente è stato compilato con -g, ma passa attraverso le linee del codice sorgente, invece di passare attraverso ogni istruzione di assemblaggio come ni o si fare in un binario compilato senza -g .

+0

Cosa vuoi fare ad ogni passo? Per 'lista': http://stackoverflow.com/questions/4362581/get-gdb-to-do-a-list-after-every-step –

risposta

7

Utilizzare si (stepi) per istruzioni passo attraverso il codice. È possibile utilizzare ni (nexti) per ignorare le funzioni della libreria che non ti interessano. Se accidentalmente entri in una di esse, finish dovrebbe riportarti alla routine originale. Le persone che lavorano a questo livello in genere hanno impostato gdb per visualizzare le prossime istruzioni che stanno per essere eseguite, ad es. disp/3i $pc.

+0

Wow, una soluzione così semplice. Stavo usando n e s, invece di ni o si. Funziona perfettamente. Sono curioso di sapere come GDB interpreta ni vs n. Inoltre, disp/3i $ pc è tremendamente utile. – smaccoun

+1

'next' utilizza le informazioni sulla linea di origine dalle informazioni di debug per determinare l'intervallo di indirizzi di una linea di origine. La riga 10 potrebbe passare da 0x100 a 0x116, quindi il debugger (dietro le quinte), l'istruzione esegue tutte le istruzioni finché il pc non è 0x116. Le complicazioni includono l'accesso a un'altra funzione o l'abbandono della funzione corrente (comando di ritorno, longjmp, eccezione generata) nel qual caso si desidera interrompere l'esecuzione. Quando il debugger entra in una chiamata di subroutine, imposta un punto di interruzione sulla funzione originale e continua. C'è un sacco di roba in corso dietro le quinte. 'ni' è il livello più basso. –

1

Non è sufficiente posizionare il punto di interruzione sulla prima riga di esecuzione e quindi scorrere ogni riga? Questo dipende da cosa stai cercando di ottenere impostando i breakpoint su ogni linea. Se si desidera valutare le espressioni, è possibile farlo seguendo la mia logica (passaggio attraverso ogni riga).

+0

Buon punto. Hai ragione, ma ho dimenticato di dire che sto eseguendo un binario che non è stato compilato con il flag -g. Non ho nemmeno accesso al codice sorgente, quindi non posso ricompilare con -g. Sfortunatamente, questo non mi lascia un singolo passo. La domanda è stata modificata per chiarezza – smaccoun

Problemi correlati