In precedenza abbiamo discusso le basi di come scrivere e compilare un programma C con il programma C Hello World.
In questo articolo, discutiamo come eseguire il debug di un programma c utilizzando il debugger gdb in 6 semplici passaggi.
Scrivi un programma C di esempio con errori a scopo di debug
Per imparare il debug del programma C, creiamo il seguente programma C che calcola e stampa il fattoriale di un numero. Tuttavia, questo programma C contiene alcuni errori per il nostro scopo di debug.
$ vim factorial.c # include <stdio.h> int main() { int i, num, j; printf ("Enter the number: "); scanf ("%d", &num ); for (i=1; i<num; i++) j=j*i; printf("The factorial of %d is %d\n",num,j); }
$ cc factorial.c $ ./a.out Enter the number: 3 The factorial of 3 is 12548672
Eseguiamo il debug mentre esaminiamo i comandi più utili in gdb.
Passo 1. Compila il programma C con l'opzione di debug -g
Compila il tuo programma C con l'opzione -g. Ciò consente al compilatore di raccogliere le informazioni di debug.
$ cc -g factorial.c
Nota:il comando precedente crea un file.out che verrà utilizzato per il debug come mostrato di seguito.
Passaggio 2. Avvia gdb
Avvia il debugger C (gdb) come mostrato di seguito.
$ gdb a.out
Passaggio 3. Imposta un punto di interruzione all'interno del programma C
Syntax: break line_number
Altri formati:
- interrompi [nome_file]:numero_linea
- interrompi [nome_file]:nome_funzione
Inserisce un punto di interruzione nel programma C, in cui si sospettano errori. Durante l'esecuzione del programma, il debugger si fermerà al punto di interruzione e ti darà la richiesta di eseguire il debug.
Quindi, prima di avviare il programma, inseriamo il seguente punto di interruzione nel nostro programma.
break 10 Breakpoint 1 at 0x804846f: file factorial.c, line 10.
Fase 4. Esegui il programma C nel debugger gdb
run [args]
Puoi iniziare a eseguire il programma usando il comando run nel debugger gdb. Puoi anche fornire argomenti della riga di comando al programma tramite run args. Il programma di esempio che abbiamo usato qui non richiede alcun argomento della riga di comando, quindi diamo esecuzione e avviamo l'esecuzione del programma.
run Starting program: /home/sathiyamoorthy/Debugging/c/a.out
Una volta eseguito, il programma C, verrà eseguito fino al primo punto di interruzione e verrà visualizzata la richiesta per il debug.
Breakpoint 1, main () at factorial.c:10 10 j=j*i;
Puoi usare vari comandi gdb per eseguire il debug del programma C come spiegato nelle sezioni seguenti.
Fase 5. Stampa dei valori delle variabili all'interno del debugger gdb
Syntax: print {variable} Examples: print i print j print num
(gdb) p i $1 = 1 (gdb) p j $2 = 3042592 (gdb) p num $3 = 3 (gdb)
Come vedete sopra, nel fattoriale.c, non abbiamo inizializzato la variabile j. Quindi, ottiene un valore spazzatura risultante in un numero elevato come valori fattoriali.
Risolvi questo problema inizializzando la variabile j con 1, compila il programma C ed eseguilo di nuovo.
Anche dopo questa correzione sembra esserci qualche problema nel programma factorial.c, poiché fornisce ancora un valore fattoriale errato.
Quindi, posiziona il punto di interruzione nella decima riga e continua come spiegato nella sezione successiva.
Passaggio 6. Continua, scavalcando e entrando – comandi gdb
Ci sono tre tipi di operazioni gdb che puoi scegliere quando il programma si ferma a un punto di interruzione. Continuano fino al punto di interruzione successivo, intervengono o scavalcano le righe di programma successive.
- c o continua:il debugger continuerà l'esecuzione fino al punto di interruzione successivo.
- n o next:il debugger eseguirà la riga successiva come istruzione singola.
- so step:come successivo, ma non tratta la funzione come una singola istruzione, invece entra nella funzione e la esegue riga per riga.
Continuando o scorrendo potresti aver scoperto che il problema è dovuto al fatto che non abbiamo utilizzato <=nel controllo delle condizioni "for loop". Quindi, modificarlo da
Usa le seguenti scorciatoie per la maggior parte delle operazioni frequenti su gdb.Scorciatoie dei comandi gdb
Comandi gdb vari