Come eseguire debug con gdb

Debug con gdb programma per errori logici

Utilizzerò due programmi per illustrare come GDB può essere utilizzato per il debug del codice

Il primo programma di esempio presenta alcuni errori logici. Il programma dovrebbe produrre la somma di (X^0)/0! + (X^1)/1! + (X^2)/2! + (X^3)/3! + (X^4)/4! + … + (X^n)/n!, dati x e n come input. Tuttavia, il programma produce un valore infinito, indipendentemente dagli input. Vi guideremo passo dopo passo attraverso il processo di debug e di tracciamento degli errori:

1. Scaricare il programma di esempio broken.cpp.

Dopo aver cliccato su questo link, si aprirà una scheda del vostro browser. Copiate incollate il testo apparso nel browser in un editore di testo (per esempio gedit) e salvatelo come “broken.cpp” .

2. Compilare il programma ed eseguitelo:

Terminale
% g++ -g broken.cpp -o broken
% ./broken

debug-con-gdb

3. Avviare il debugger

Qualunque sia l’input, l’output sarà inf. L’opzione -g è importante perché consente un debug GDB significativo:

Terminale
gdb broken

debug-con-gdb
Questa operazione avvia solo il debugger; non avvia l’esecuzione del programma nel debugger.

4. Guardate il codice sorgente e impostate un punto di interruzione alla riga 43:

Terminale
(gdb) b 43

debug-con-gdb

Breakpoint 1 at 0x5555555553e4: file broken.cpp, line 43.

5. Ora iniziamo a eseguire il programma nel debugger:

Terminale
(gdb) run

debug-con-gdb
Nota: se è necessario fornire gli argomenti da riga di comando per l’esecuzione del programma, è sufficiente includerli dopo il comando:

Terminale
run

, come si fa normalmente sulla riga di comando.

6. Il programma si avvia e chiede l’input

Inseriamo i valori x=1 e n=3. Il valore di uscita previsto è 4. Il risultato è un’altra cosa.1 Di seguito è riportata un’istantanea del programma in esecuzione nel debugger:

This program is used to compute the value of the following series : (x^0)/0! + (x^1)/1! + (x^2)/2! + (x^3)/3! + (x^4)/4! + ........ + (x^n)/n! Please enter the value of x : 1 Please enter an integer value for n : 3
Breakpoint 1, main () at broken.cpp:43
43 double seriesValue = ComputeSeriesValue(x, n);

Notare che l’esecuzione del programma si è fermata al primo (e unico) punto di interruzione.

7. Passaggio alla funzione ComputeSeriesValue()

Per entrare in una chiamata di funzione, si utilizza il seguente comando:

Terminale
(gdb) step
ComputeSeriesValue (x=1, n=3) at broken.cpp:17
17 double seriesValue = 0.0;

A questo punto, il controllo del programma si trova alla prima istruzione della funzione ComputeSeriesValue (x=1, n=3).

8. Quindi, scorriamo il programma fino ad arrivare a ComputeFactorial:

Terminale
(gdb) next
20 for (int k = 0; k <= n; k++) {
Terminale
(gdb) n
21 seriesValue += xpow / ComputeFactorial(k);
Terminale

(gdb)

Terminale
21 seriesValue += xpow / ComputeFactorial(k);
(gdb) s
Terminale
ComputeFactorial (number=0) at broken.cpp:7
7 int fact = 0;

[/su_note]

Qui usiamo il successivo comando, che è simile a step, tranne che per il fatto che va sopra le funzioni invece di entrarci. In questo caso La distinzioni non hanno importanza, poiché non ci sono funzioni. Per risparmiare un po’ di battitura, potete utilizzare l’ortografia più breve e non ambigua di un comando GDB. Qui usiamo rispettivamente n e s invece di next e step. Se il comando è semplicemente una ripetizione del comando precedente, si può premere semplicemente return, che eseguirà l’ultimo comando. Infine, facciamo un passo (con s) in ComputeFactorial(). (Se avessimo usato next, avremmo superato ComputeFactorial).

9. Dove siamo?

Se si vuole sapere dove ci si trova nell’esecuzione del programma (e come, in parte, ci si è arrivati), si può visualizzare il contenuto dello stack usando il comando backtrace come segue:

Terminale
 
(gdb) bt
#0 ComputeFactorial (number=0) at broken.cpp:7
#1 0x000055555555529c in ComputeSeriesValue (x=1, n=3) at broken.cpp:21
#2 0x00005555555553f7 in main () at broken.cpp:43

Osservare i cambiamenti Si può procedere con il programma ed esaminare i valori utilizzando il comando print:

Terminale
(gdb) n
9 for (int j = 1; j <= number; j++) {
Terminale
(gdb) n

14 }

Terminale
(gdb) n
9 per (int j = 0; j <= numero; j++) {
Terminale
$2 = 0
Terminale
 
(gdb) n
13 return fact;
Terminale
(gdb) quit

Il comando print (abbreviato p) rivela che il valore di fact non cambia mai. Si noti che la funzione restituisce il valore 0 per la chiamata di funzione ComputeFactorial(number=0). Questo è un ERRORE!

Osservando più da vicino i valori stampati sopra, ci si rende conto che si sta calcolando fact=fact * j dove fact è stato inizializzato a 0; fact avrebbe dovuto essere inizializzato a 1. Chiudiamo GDB con il comando quit. Quindi dobbiamo modificare la seguente riga:

int fact = 1;

 

Grazie! per l’utilizzo della Guida di Linuxiano.

Trovi questo tutorial utile? Condividi con i tuoi amici per tenerlo in vita.
Sii il primo a commentare, apprezzo i tuoi suggerimenti. Per ulteriori domande potete commentare qui sotto.

Fonte: https://linuxiano.altervista.org/2022/11/debug-con-gdb/

Se vuoi sostenerci, puoi farlo acquistando qualsiasi cosa dai diversi link di affiliazione che abbiamo nel nostro sito o partendo da qui oppure alcune di queste distribuzioni GNU/Linux che sono disponibili sul nostro negozio online, quelle mancanti possono essere comunque richieste, e su cui trovi anche PC, NAS e il ns ServerOne. Se ti senti generoso, puoi anche donarmi solo 1€ o più se vuoi con PayPal e aiutarmi a continuare a pubblicare più contenuti come questo. Grazie!

Hai dubbi o problemi? Ti aiutiamo noi!

Se vuoi rimanere sempre aggiornato, iscriviti al nostro canale Telegram.
Se vuoi ricevere supporto per qualsiasi dubbio o problema, iscriviti alla nostra community Facebook o gruppo Telegram.
Cosa ne pensi? Fateci sapere i vostri pensieri nei commenti qui sotto.
Ti piace quello che leggi? Per favore condividilo con gli altri.
Amazon Music
Scopri le ultime offerte per dischi ssd su Acquista su Amazon
Scopri le ultime offerte per memorie RAM DDR su Acquista su Amazon
Scopri le ultime offerte per Chromebook su Acquista su Amazon
Scopri le ultime offerte per Raspberry su Acquista su Amazon

Potrebbero interessarti anche...

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.