Come usare GNU Debugger in Linux

GNU Debugger è usato per eseguire il debug di un programma, per analizzare il crash o per vedere cosa fa il programma in un punto particolare. È stato sviluppato dal Progetto GNU negli anni '80 ed è stato uno dei debugger da riga di comando più utilizzati nonché uno dei software GNU più popolari.

Scriviamo prima un piccolo programma C di cui poi eseguiremo il debug. Per iniziare, crea un nuovo .C file usando vim o qualsiasi editor di tua scelta:

vim test.c

Creare il seguente programma C:

#include int main() { int i = 5; float f = 5,5 i = i + 3; f = f + 2,2; printf("I valori di i e f sono: %d e %f\n", i, f); restituisce 0; }

premere Fuga per passare alla modalità di comando vim. Quindi digita :wq per salvare il programma ed uscire.

Compila e verifica se il programma viene eseguito:

gcc test.c -o test ./test I valori di i e f sono: 8 e 7.700000

Per abilitare il supporto per il debug in un programma, lo compiliamo con -G bandiera. Se il flag non viene utilizzato, l'utente può comunque eseguire il debug del programma, anche se con opzioni limitate.

gcc test.c -g -o test

Per avviare il debug il nostro file eseguibile test in gdb, corriamo:

gdb test

Si aprirà il gdb console, dove è possibile digitare il gdb comandi. Per vedere un elenco di comandi usa il aiuto comando.

$(gdb) help Elenco delle classi di comandi: alias -- Alias ​​di altri comandi breakpoints -- Arresto del programma in determinati punti data -- Esame dei file di dati -- Specifica ed esame dei file interni -- Comandi di manutenzione oscuri -- Funzionalità oscure in esecuzione -- Esecuzione dello stack del programma -- Esame dello stato dello stack -- Supporto per richieste di stato -- Tracepoint delle strutture di supporto -- Traccia dell'esecuzione del programma senza arrestare il programma definito dall'utente -- Comandi definiti dall'utente Digitare "help" seguito da un nome di classe per un elenco di comandi in quella classe. Digita "help all" per l'elenco di tutti i comandi. Digita "help" seguito dal nome del comando per la documentazione completa. Digita "apropos word" per cercare i comandi relativi a "word". Le abbreviazioni dei nomi dei comandi sono consentite se non ambigue.

Puoi quindi digitare aiuto nome_classe per vedere i comandi appartenenti a quella classe. Per cercare i comandi usando una sottostringa, usa a proposito di sottostringa.

Per impostare un punto di interruzione quando il programma entra in una funzione, correre:

$(gdb) interruzione principale

Qui impostiamo un punto di interruzione nell'unica funzione nel nostro codice, ad es. principale. Usa il comando correre per eseguire il programma fino al prossimo punto di interruzione o fino all'uscita.

$(gdb) esegui

Per impostare un punto di interruzione in una posizione particolare in una funzione, uso:

pausa *principale + 4

Questo imposterà un punto di interruzione alla 4a riga della funzione main.

Ora, per passare dal flusso del programma alla riga di codice successiva, esegui semplicemente il fare un passo comando.

$(gdb) passaggio 5: float f = 5,5;

Per visualizzare il contenuto di una variabile, correre Schermo .

$(gdb) visualizza i 6: i = 5

Per modificare il contenuto di una variabile, che potrebbe essere richiesto per analizzare l'esecuzione di un programma in base a valori specifici di una variabile, run imposta variabile =Espressione.

$(gdb) imposta variabile i=10 $(gdb) visualizza i 7: i = 10

Qui, l'"Espressione" può essere qualsiasi espressione valida (aritmetica / logica). Per semplicità assegniamo semplicemente un altro valore (10) alla variabile io.

Per stampare il codice assembly per il programma, usa il comando disassemblare nomefunzione:

Usa solo smontare per stampare il codice assembly per l'intero programma. Notare la freccia in corrispondenza di una riga particolare nel codice dell'assieme. Indica che la sessione di debug è attualmente in pausa in quella particolare posizione di memoria (cioè quella riga di codice).

Per saltare il debugger a una particolare riga di codice, correre:

$(gdb) salta *main + 2 Continuando a 0x400528. Punto di interruzione 2, 0x000000000040052a in main() at test.c:3 3 int main() { 1: i = 2: f = 3: h = (void *) 0x0 4: main = {int ()} 0x400526 5: i = 

Questo farà saltare il debugger alla posizione di memoria della seconda riga di codice in funzione principale. Nota che qui sono passato dall'inizio della posizione principale direttamente alla seconda posizione. Quindi, variabile io non è mai stato impostato, il che provoca l'errore di lancio del debugger che non può accedere al contenuto della memoria all'indirizzo della variabile io.

Questi sono alcuni dei comandi di base che possono aiutarti a iniziare con il debug di un file eseguibile in Linux. Ci auguriamo che le informazioni su questa pagina siano utili.