Gdb è uno strumento essenziale per il debug dei programmi C.
I punti di interruzione sono il modo per dire a GDB di interrompere o sospendere l'esecuzione del programma su una determinata riga, funzione o indirizzo. Una volta interrotto il programma, puoi esaminare e modificare i valori delle variabili, continuare l'esecuzione del programma da quel punto di interruzione, ecc.
Se non conosci GDB, dovresti prima comprendere le basi di come eseguire il debug di C programma utilizzando GDB.
Questo tutorial utilizzerà il codice seguente per descrivere il punto di interruzione gdb con esempi.
#include <stdio.h> int power(int,int); int main() { int i; printf("Program to calculate power\n"); for (i=0;i<10;i++) printf("%d %d\n",i, power(2,i)); return 0; } int power (int base, int n) { int i,p; p=1; for (i=1; i<=n; i++) p = p*base; return p; } # cc -g power.c
Ora hai un eseguibile che calcola la potenza di base 2 da 0 a 9.
1. Come impostare un punto di interruzione in funzione
# gdb (gdb) file ./a.out Reading symbols from /home/lakshmanan/a.out...done. (gdb) b power Breakpoint 1 at 0x40055d: file power.c, line 16. (gdb) run Starting program: /home/lakshmanan/./a.out Program to calculate power Breakpoint 1, power (base=2, n=0) at power.c:17 17 p=1;
Stiamo impostando un punto di interruzione all'alimentazione della funzione ed eseguiamo il programma. Il programma continuerà l'esecuzione fino alla chiamata della funzione a power(). Una volta incontrata la funzione, il programma si fermerà.
2. Ottieni le informazioni sugli argomenti passati a una funzione
Per conoscere gli argomenti passati alla funzione, usa 'info args'.
(gdb) info args base = 2 n = 0
3. Ottieni le informazioni sulle variabili locali
Per conoscere le informazioni sulle variabili locali accessibili all'interno di questa funzione (frame dello stack corrente) usa 'info locals'.
(gdb) info locals i = 32767 p = -7840
4. Continua l'esecuzione del programma fino al prossimo punto di interruzione
Per continuare il programma fino al punto di interruzione successivo, usa 'continua'.
(gdb) continue Continuing. 0 1 Breakpoint 1, power (base=2, n=1) at power.c:16 16 int i=0,p=1;
Una volta che diamo "continua", la funzione di alimentazione è stata eseguita e stampato il risultato. La stessa funzione di alimentazione è stata richiamata di nuovo da 'main()' per loop, quindi il programma è stato interrotto nuovamente.
5. Ottieni informazioni su tutti i punti di interruzione
Puoi conoscere le informazioni relative ai punti di interruzione utilizzando "info punti di interruzione".
(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004005a7 in power at power.c:16 breakpoint already hit 2 times
Ora abbiamo impostato un solo punto di interruzione e vengono visualizzate le informazioni relative ai punti di interruzione.
6. Elimina un punto di interruzione esistente
Per eliminare un punto di interruzione esistente, usa "elimina punti di interruzione"
(gdb) delete breakpoints 1 (gdb) info breakpoints No breakpoints or watchpoints.
Ora abbiamo eliminato il punto di interruzione che era presente nella funzione di alimentazione.
7. Imposta un punto di interruzione temporaneo
A volte potresti voler interrompere il programma in un punto solo una volta. Puoi usare punti di interruzione temporanei per questo. Un punto di interruzione temporaneo interrompe il programma solo una volta, quindi verrà rimosso.
(gdb) tbreak power Temporary breakpoint 3 at 0x4005a7: file power.c, line 16. (gdb) info breakpoints Num Type Disp Enb Address What 3 breakpoint del y 0x00000000004005a7 in power at power.c:16 (gdb) continue Continuing. 1 2 Temporary breakpoint 3, power (base=2, n=2) at power.c:16 16 int i=0,p=1; (gdb) info breakpoints No breakpoints or watchpoints.