Corso di C con Linux

Sessione di esempio con il Gnu Debugger

 

Nella sessione di esempio, userò il carattere ## per indicare un commento che non fa parte della sessione stessa.

       ##compiliamo il nostro file a dovere:

       cyberspace.org:~$ make
       gcc -g -c -Wall main.c
       gcc -g -c -Wall token.c
       gcc -g -o matrix main.o token.o

       ## avviamo il gdb
       cyberspace.org:~$ gdb matrix

       GNU gdb 4.18
       Copyright 1998 Free Software Foundation, Inc.
       GDB is free software, covered by the GNU General Public License, and you are
       welcome to change it and/or distribute copies of it under certain conditions.
       Type "show copying" to see the conditions.
       There is absolutely no warranty for GDB.  Type "show warranty" for details.
       This GDB was configured as "i686-pc-linux-gnu"...
       ##
       ## impostiamo un breakpoint alla linea 23
       (gdb) break 23
       Breakpoint 1 at 0x8048478: file main.c, line 23.

##
       ## eseguiamo il programma fino alla linea 23.
       (gdb) run
       Starting program: /home/gzoppi/last/matrix

       Breakpoint 1, main () at main.c:24
       24      int main (void) {
       ## Andiamo avanti con l'esecuzione passo dopo passo
       (gdb) step
       main () at main.c:30
       30      do {
       ## Andiamo avanti con l'esecuzione passo dopo passo
       (gdb) step
       31      dim=0;
       ## Andiamo avanti con l'esecuzione passo dopo passo
       (gdb) step
       32      input=NULL;
       # Stampiamo il valore della variabile dim
       (gdb) print dim
       $1 = 0
       ## Impostiamo un watchpoint sulla variabile dim.
       (gdb) watch dim
       Hardware watchpoint 2: dim
       ## Continuiamo l'esecuzione fino al prossimo watchpoint
       (gdb) continue
       Continuing.
       #0  main () at main.c:32
       32      input=NULL;
       Hardware watchpoint 2: dim
       ## Qui viene modificato il valore della dim e si verifica un watchpoint
       Old value = 0
       New value = 120
       0x4006969f in getdelim () from /lib/libc.so.6

       ## Guardiamo cosa c'é nello stack
       (gdb) backtrace
       #0  0x4006969f in getdelim () from /lib/libc.so.6
       #1  0x40068a18 in getline () from /lib/libc.so.6
       #2  0x80484a1 in main () at main.c:33
## Continuiamo l'esecuzione fino alla fine della funzione getdelim, chiamata internamente dalla getline, usata nel nostro programma.
       (gdb) finish
       Run till exit from #0  0x4006969f in getdelim () from /lib/libc.so.6
       #0  0x4006969f in getdelim () from /lib/libc.so.6
       0x40068a18 in getline () from /lib/libc.so.6
       ## Visualizziamo tutte le informazioni relative ai nostri watchpoint
       (gdb) info watch
       Num Type           Disp Enb Address    What
       1   breakpoint     keep y   0x08048478 in main at main.c:23
               breakpoint already hit 1 time
       2   hw watchpoint  keep y   dim
       ## Visualizziamo il sorgente
       (gdb) list
       27      char *input;
       28      int dim,size;
       29     
       30      do {
       31      dim=0;
       32      input=NULL;
       33      size=getline(&input,&dim,stdin);
       34      stop=reserved_token(input,size);
       35      } while (stop!=QUIT);
       36      return EXIT_SUCCESS;

       ## disabilitiamo il breakpoint 2 (che é un watchpoint)
       (gdb) disable 2
       ## ancora passo-passo
       (gdb) step
       Single stepping until exit from function getline,
       which has no line number information.
       main () at main.c:34
       34      stop=reserved_token(input,size);
       (gdb) step
       reserved_token (stringa=0x80499c8 "LUIGI\n", dimensione=6) at token.c:24
       24        char *tkn;
       ## Guardiamo i sorgenti della sottofunzione
       (gdb) list
       19                     else return ID;
       20      }
       21     
       22      keyword reserved_token (char *stringa, int dimensione) {
       23     
       24        char *tkn;
       25        char *running;
       26     
       27        keyword token;
       28     
       #finiamo la sottofunzione
       (gdb) finish

       Run till exit from #0  reserved_token (stringa=0x80499c8 "LUIGI\n",
           dimensione=6) at token.c:24
       0x80484b6 in main () at main.c:34
       34      stop=reserved_token(input,size);
       Value returned is $2 = EMPTY
       ## Continuo dopo...e quindi faccio quit per uscire
       (gdb) quit
       The program is running.  Exit anyway? (y or n)

 

Torna all'indice Generale del corso di Corso di C con Linux di Software Planet