🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Debugging con GDB

Codegrind Team•Aug 23 2024

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 (o r): 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] o b [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 (o n): Esegue la prossima istruzione, senza entrare nelle funzioni chiamate.
(gdb) next
  • step (o s): Esegue la prossima istruzione, entrando nelle funzioni chiamate.
(gdb) step
  • continue (o c): Continua l’esecuzione fino al prossimo breakpoint.
(gdb) continue

4. Ispezionare Variabili

  • print [variabile] (o p [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 (o bt): 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 (o q): 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.