2013-06-07 15 views
8

Una domanda di base & Sono molto nuovo in C/C++ e GDB.in che modo GDB sa che deve interrompersi al punto di interruzione specificato?

Utilizziamo GDB per eseguire il debug di un processo. Alleghiamo GDB a un processo e quindi specificiamo filename.c insieme al numero di riga per inserire il punto di interruzione.

La mia domanda è "In che modo GDB o OS O forse qualcos'altro sa che deve rompere al numero di riga specificato (in filename.c) dopo aver connesso GDB al processo in esecuzione?"

Che cosa sta entrando in figura che, ad esempio, il processo corrente viene eseguito in modalità di debug e viene applicato un punto di interruzione e l'esecuzione del processo deve interrompersi (attendere l'input dell'utente) in quel punto?

+0

Dai un'occhiata a [ptrace (2)] (http://linux.die.net/man/2/ptrace) – nouney

+1

@nouney: Sarebbe una buona base per un'ottima risposta. –

risposta

6

Non riesco a commentare l'ultima versione di gdb - ma molti debugger in realtà scambiano l'istruzione di assemblaggio nel punto di breakpoint desiderato (in memoria) con un'istruzione di interrupt. Questo "sveglia" il debugger che prende il controllo a questo punto.

L'utilizzo di un'istruzione di interruzione sostituita indica che la CPU può eseguire il programma a piena velocità e "scattare" nella posizione desiderata.

I processori moderni sono tuttavia molto complessi e probabilmente presentano funzioni di debug di gran lunga superiori.

-2

Se si è utilizzata l'opzione -g in gcc/g ++, i numeri di riga di ciascun file di origine sono allegati alle istruzioni nei file oggetto risultanti.

9

Allo stesso modo, se il programma si arresta o si arresta in modo anomalo in un punto particolare, il debugger può indicare la posizione del programma in quel punto.

per entrambi questi per lavorare il binario programma deve contenere le informazioni di debug aggiuntive che associa gli indirizzi l'immagine programma con sedi nel codice sorgente (file di origine e il numero di riga.)

Per aggiungere un punto di interruzione in un particolare line il debugger trova l'indirizzo del programma più vicino a quella linea, modifica la copia dell'eseguibile in memoria per inserire una speciale istruzione "break" in quella posizione che causerà l'interruzione dell'esecuzione del programma, quindi "traccia" l'esecuzione e le attese del programma per raggiungere il punto di interruzione e fermarsi.

Per maggiori dettagli si veda http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1/ e http://www.howzatt.demon.co.uk/articles/SimplePTrace.html

+3

Su molte architetture (ad es. X86) i registri di debug consentono di impostare (pochi) punti di interruzione senza modificare il testo del programma. –

+0

Non lo sapevo, grazie (e grazie per la modifica) –

1

GDB è a conoscenza del codice: si sa tutto su di esso. Quando si imposta un punto di interruzione su una linea, GDB ottiene l'indirizzo di istruzione della macchina equivalente: tutto il codice (come istruzioni macchina) viene caricato in memoria, quindi le istruzioni del codice hanno un indirizzo.

Quindi ora GDB conosce l'indirizzo dell'istruzione che si desidera interrompere. Quando esegui il tuo programma, GDB userà ptrace, che consente a GDB di "vedere" ciascuna istruzione prima dell'esecuzione. Quindi GDB deve solo verificare se l'istruzione corrente (che verrà eseguita) è la stessa dell'istruzione (che si desidera interrompere).

+0

Il metodo che hai descritto è possibile, ma così lento (1000x o più) da essere inutilizzabile nella pratica. Non è così che i debugger utilizzabili * effettivamente * funzionano. –

+0

Sono d'accordo ... sarebbe troppo lento – Gana

Problemi correlati