2009-05-07 12 views
7

Ho provato a guardare il cambiamento di "int a" dal comando "guarda un". Tuttavia, il programma non si ferma, quando diventa 12. Perché?Come posso utilizzare "watch" GDB?

/* FILE: test.c */ 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char** argv){ 
    printf("Hello world\n"); 

    int a = 12; 
    a = 10;                                          
    return 0; 
} 
+0

Hai compilato con le informazioni di debug (-g) e sei sicuro di star usando la versione di debug? – dirkgently

risposta

11

Può essere utile specificare la piattaforma, la versione di GDB e la sequenza esatta di comandi GDB utilizzati.

Ecco quello che vedo (GDB sembra funzionare bene):

$ gcc -g test.c 

$ gdb a.out 
GNU gdb (GDB) 6.8.50.20090430-cvs 
Copyright (C) 2009 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-unknown-linux-gnu". 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>... 
(gdb) list 
1  #include <stdio.h> 
2  #include <stdlib.h> 
3 
4  int main(int argc, char** argv){ 
5   printf("Hello world\n"); 
6 
7   int a = 12; 
8   a = 10;                                          
9   return 0; 
10  } 
11 
(gdb) b 5 
Breakpoint 1 at 0x4004a7: file test.c, line 5. 
(gdb) r 

Breakpoint 1, main (argc=1, argv=0x7fffffffdb28) at test.c:5 
5   printf("Hello world\n"); 
(gdb) watch a 
Hardware watchpoint 2: a 
(gdb) c 
Hello world 
Hardware watchpoint 2: a 

Old value = 0 
New value = 12 
main (argc=1, argv=0x7fffffffdb28) at test.c:8 
8   a = 10;                                          
(gdb) c 
Hardware watchpoint 2: a 

Old value = 12 
New value = 10 
main (argc=1, argv=0x7fffffffdb28) at test.c:9 
9   return 0; 
(gdb) c 

Watchpoint 2 deleted because the program has left the block in 
which its expression is valid. 
0x00007ffff7ab3033 in exit() from /lib/libc.so.6 
(gdb) c 

Program exited normally. 
(gdb) q 
1

Il compilatore è probabile che nemmeno la generazione di codice per assegnare 12 "a", sarebbe una buona idea di smontare il codice generato per confermare. Probabilmente hai bisogno di un test leggermente più complesso per provarlo.

3

Quando si desidera eseguire il debug di un programma che si dovrebbe sempre costruire con -O0 -g3 (prendo che si sta utilizzando gcc, se non lo sei, il tuo compilatore probabilmente supporterà altri flag per disattivare l'ottimizzazione e abilitare le informazioni di debug).

Sul mio sistema (x86_64 con Gentoo GNU/Linux) non riesco a raggiungere la riga 'int a = 12' quando utilizzo un'ottimizzazione maggiore o uguale a -O come il compilatore applicherà quindi dead code elimination. (Tratto da here, è il flag -fdce nella sezione -O)

Tenetelo sempre a mente quando esegui il debugging! Verifica il tuo codice smontandolo con objdump -D o chiedi al tuo compilatore di mostrarti l'assembly generato (su gcc con il flag -S)

Problemi correlati