GNU/Linux >> Linux Esercitazione >  >> Linux

Come eseguire il debug del programma C utilizzando gdb in 6 semplici passaggi

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

Scorciatoie dei comandi gdb

Usa le seguenti scorciatoie per la maggior parte delle operazioni frequenti su gdb.

  • l – elenco
  • p – stampa
  • c – continua
  • s – passaggio
  • INVIO:premendo il tasto Invio si eseguirà nuovamente il comando precedentemente eseguito.

Comandi gdb vari

  • Comando io: Utilizzare il comando gdb l o list per stampare il codice sorgente nella modalità di debug. Utilizzare l numero di riga per visualizzare un numero di riga specifico (oppure) l funzione per visualizzare una funzione specifica.
  • bt:tornare indietro – Stampa il backtrace di tutti i frame dello stack o dei COUNT frame più interni.
  • aiuto – Visualizza la guida per un particolare argomento di gdb — help TOPICNAME.
  • chiudi – Esci dal debugger gdb.

Linux
  1. Esegui il debug di Linux usando ProcDump

  2. Come eseguire il debug di programmi C in Linux usando gdb

  3. Come eseguire il debug di uno script Bash?

  4. Tutorial per il debugger di Perl:10 semplici passaggi per eseguire il debug del programma Perl

  5. Come creare file Proc Linux nel programma C usando LKM

Come applicare a tema GNOME Shell 3.16 (in cinque semplici passaggi)

Come tracciare l'esecuzione del programma utilizzando il comando Strace di Linux

Come compilare C, C++ e Java utilizzando Terminal su Linux

Come utilizzare GDB per eseguire il debug di programmi in Ubuntu 20.04

Come creare testo curva in GIMP in 5 semplici passaggi [Tutorial per principianti GIMP]

Suggerimenti per Ubuntu:come gestire progetti semplici usando Tomboy Notes