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.