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.