GDB - Debug di programmi

Guida introduttiva: avvio e arresto

  • gcc -g mioprogramma.c

    • Compila myprogram.c con l'opzione di debug (-g). Hai ancora un a.out, ma contiene informazioni di debug che ti consentono di utilizzare variabili e nomi di funzioni all'interno di GDB, piuttosto che posizioni di memoria non elaborate (non divertente).

  • gdb a.out

    • Apre GDB con il file a.out, ma non esegue il programma. Vedrai un prompt (gdb): tutti gli esempi provengono da questo prompt.

  • r

  • r arg1 arg2

  • r <file1

    • Tre modi per eseguire "a.out", caricato in precedenza. Puoi eseguirlo direttamente (r), passare argomenti (r arg1 arg2) o inserire un feed in un file. Di solito imposterai i punti di interruzione prima di eseguire.

  • help

  • h punti di interruzione

    • Elenca gli argomenti della guida (guida) o ottiene la guida su un argomento specifico (punti di interruzione h). GDB è ben documentato.

  • q - Esci da GDB

Passaggio attraverso il codice

Stepping ti consente di tracciare il percorso del tuo programma e di concentrarti sul codice che si blocca o restituisce input non validi.

  • l

  • l 50

  • la mia funzione

    • Elenca 10 righe di codice sorgente per la riga corrente (l), una riga specifica (l 50) o per una funzione (l myfunction).

  • Il prossimo

    • Esegue il programma fino alla riga successiva, quindi si interrompe. Se la riga corrente è una funzione, esegue l'intera funzione, quindi si interrompe.next è utile per esaminare rapidamente il codice.

  • passo

    • Esegue l'istruzione successiva, non la riga. Se l'istruzione corrente sta impostando una variabile, è uguale anext. Se è una funzione, salterà nella funzione, eseguirà la prima istruzione, quindi si fermerà.step è utile per immergersi nei dettagli del codice.

  • finire

    • Termina l'esecuzione della funzione corrente, quindi mette in pausa (chiamata anche uscita). Utile se sei entrato accidentalmente in una funzione.

Punti di interruzione o punti di osservazione

I punti di interruzione svolgono un ruolo importante nel debug. Mettono in pausa (interrompono) un programma quando raggiunge un certo punto. È possibile esaminare e modificare le variabili e riprendere l'esecuzione. Ciò è utile quando si verifica un errore di input o è necessario testare gli input.

  • rompere 45

  • interrompere la mia funzione

    • Imposta un punto di interruzione alla riga 45 o alla mia funzione. Il programma si fermerà quando raggiunge il punto di interruzione.
  • guarda x == 3

    • Imposta un watchpoint, che mette in pausa il programma quando cambia una condizione (quando x == 3 cambia). I punti di controllo sono ottimi per determinati input (myPtr! = NULL) senza dover interrompere ogni chiamata di funzione.

  • Continua

    • Riprende l'esecuzione dopo essere stato messo in pausa da un breakpoint / watchpoint. Il programma continuerà fino a quando non raggiunge il punto di interruzione / controllo successivo.

  • eliminare N

    • Elimina il punto di interruzione N (i punti di interruzione vengono numerati quando vengono creati).

Impostazione delle variabili

La visualizzazione e la modifica delle variabili in fase di esecuzione è una parte fondamentale del debug. Prova a fornire input non validi alle funzioni o ad eseguire altri casi di test per trovare la causa principale dei problemi. In genere, verranno visualizzate / impostate le variabili quando il programma è in pausa.

  • stampa x

    • Stampa il valore corrente della variabile x. Essere in grado di utilizzare i nomi delle variabili originali è il motivo per cui è necessario il flag (-g); ai programmi compilati regolarmente queste informazioni vengono rimosse.

  • impostare x = 3

  • impostare x = y

    • Imposta x su un valore impostato (3) o su un'altra variabile (y)
  • chiama myfunction ()

  • chiama la mia altra funzione (x)

  • chiama strlen (mystring)

    • Richiama funzioni definite dall'utente o di sistema. Questo è estremamente utile, ma attenzione a non chiamare funzioni con errori.

  • visualizzare x

    • Visualizza costantemente il valore della variabile x, che viene mostrato dopo ogni passaggio o pausa. Utile se controlli costantemente un certo valore.

  • undisplay x

    • Rimuove la visualizzazione costante di una variabile visualizzata dal comando di visualizzazione.

Backtrace e modifica dei fotogrammi

Uno stack è un elenco delle chiamate di funzione correnti: ti mostra dove ti trovi nel programma. Un frame memorizza i dettagli di una singola chiamata di funzione, come gli argomenti.

  • bt

    • Backtraceso stampa lo stack di funzioni corrente per mostrare dove ti trovi nel programma corrente. Se main chiama la funzione a (), che chiama b (), che chiama c (), il backtrace è

  • c <= current location 
    b 
    a 
    main
  • up

  • giù

    • Passa al fotogramma successivo in alto o in basso nello stack delle funzioni. Se sei inc, puoi passare a b o a esaminare le variabili locali.

  • ritorno

    • Restituisce dalla funzione corrente.

Segnali di gestione

I segnali sono messaggi lanciati dopo determinati eventi, come un timer o un errore. GDB può fermarsi quando incontra un segnale; potresti invece ignorarli.

  • handle [signalname] [action]

  • maniglia SIGUSR1 nostop

  • maniglia SIGUSR1 noprint

  • gestire SIGUSR1 ignorare

    • Indicare a GDB di ignorare un determinato segnale (SIGUSR1) quando si verifica. Esistono diversi livelli di ignoranza.