Debugging con GDB
Il debugging è una fase cruciale nello sviluppo di software, e GDB (GNU Debugger) è uno degli strumenti più potenti per il debugging di programmi scritti in C. GDB permette di eseguire il codice passo-passo, impostare breakpoint, ispezionare variabili, e comprendere meglio il comportamento del programma durante l’esecuzione. In questa guida, esploreremo come utilizzare GDB per identificare e risolvere bug nei tuoi programmi C.
Introduzione a GDB
GDB è un debugger a riga di comando che consente di analizzare un programma durante la sua esecuzione. Può essere utilizzato per eseguire il programma passo-passo, esaminare lo stato delle variabili, monitorare la chiamata delle funzioni, e molto altro.
Preparare il Programma per il Debugging
Per utilizzare GDB, il programma deve essere compilato con informazioni di debug. Questo si ottiene aggiungendo l’opzione -g
durante la compilazione.
Esempio di Compilazione con Informazioni di Debug
gcc -g -o mio_programma main.c
Avviare GDB
Una volta compilato il programma, puoi avviare GDB con il comando seguente:
gdb ./mio_programma
Esempio di Avvio di GDB
(gdb)
Questo comando apre l’interfaccia di GDB, pronta per accettare i comandi di debugging.
Comandi di Base di GDB
1. Avviare e Eseguire il Programma
run
(or
): Avvia il programma all’interno di GDB.
(gdb) run
2. Impostare Breakpoint
I breakpoint permettono di fermare l’esecuzione del programma in un punto specifico, in modo da poter ispezionare lo stato del programma.
break [file:line]
ob [file:line]
: Imposta un breakpoint in una specifica linea di codice.
(gdb) break main.c:10
break [function]
: Imposta un breakpoint all’inizio di una funzione.
(gdb) break main
3. Eseguire il Programma Passo-Passo
next
(on
): Esegue la prossima istruzione, senza entrare nelle funzioni chiamate.
(gdb) next
step
(os
): Esegue la prossima istruzione, entrando nelle funzioni chiamate.
(gdb) step
continue
(oc
): Continua l’esecuzione fino al prossimo breakpoint.
(gdb) continue
4. Ispezionare Variabili
print [variabile]
(op [variabile]
): Mostra il valore di una variabile.
(gdb) print x
info locals
: Mostra tutte le variabili locali nella funzione corrente.
(gdb) info locals
5. Esaminare la Pila di Chiamate
backtrace
(obt
): Mostra la pila di chiamate (call stack), utile per vedere la sequenza di funzioni chiamate fino al punto corrente.
(gdb) backtrace
6. Modificare il Valore delle Variabili
set variable [variabile]=[valore]
: Modifica il valore di una variabile durante l’esecuzione del programma.
(gdb) set variable x=5
7. Uscire da GDB
quit
(oq
): Esce da GDB.
(gdb) quit
Debugging Avanzato con GDB
1. Watchpoints
I watchpoint sono simili ai breakpoint, ma si attivano quando il valore di una variabile cambia.
watch [variabile]
: Imposta un watchpoint su una variabile.
(gdb) watch x
2. Condizioni sui Breakpoint
È possibile impostare condizioni su un breakpoint, in modo che venga attivato solo se una certa condizione è vera.
condition [numero_breakpoint] [condizione]
: Imposta una condizione su un breakpoint.
(gdb) condition 1 x > 10
3. Esaminare Memoria
GDB permette di esaminare direttamente la memoria a un dato indirizzo.
x/[n][format] [indirizzo]
: Esamina la memoria.
(gdb) x/4xw &x
Questo comando esamina 4 parole di memoria (4x) a partire dall’indirizzo di x
, mostrando i valori in formato esadecimale (x
).
4. Caricamento di Core Dump
GDB può essere utilizzato per esaminare i core dump, che sono file generati quando un programma si arresta in modo anomalo.
gdb ./mio_programma core
: Carica il core dump.
gdb ./mio_programma core
5. Esecuzione di Script con GDB
GDB permette di eseguire script che contengono comandi di debugging.
source [file]
: Esegue i comandi contenuti in un file.
(gdb) source debug_script.gdb
Utilizzo di TUI Mode
GDB include una modalità interfaccia utente testuale (TUI) che offre una vista split-screen del codice sorgente e delle variabili durante il debugging.
layout src
: Attiva la visualizzazione del codice sorgente.
(gdb) layout src
Debugging di Programmi Multi-thread
GDB supporta il debugging di programmi multi-thread, permettendo di ispezionare e controllare singoli thread.
info threads
: Mostra tutti i thread attivi.
(gdb) info threads
thread [numero_thread]
: Passa a un thread specifico.
(gdb) thread 2
Conclusioni
GDB è uno strumento fondamentale per il debugging di programmi C, offrendo una vasta gamma di comandi e funzionalità per analizzare e correggere il codice. Con la pratica, l’uso di GDB diventerà una parte essenziale del tuo processo di sviluppo, aiutandoti a risolvere bug complessi e a migliorare la qualità del tuo software.