2009-05-07 10 views
7

J'ai essayé de regarder le changement du "int a" par la commande "watch a". Cependant, le programme ne s'arrête pas, quand il passe à 12. Pourquoi?Comment puis-je utiliser "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

Avez-vous compilé avec les informations de débogage (-g) et êtes-vous sûr d'utiliser la version de débogage? – dirkgently

Répondre

11

Il peut être utile de spécifier votre plate-forme, la version de GDB et la séquence exacte des commandes GDB que vous avez utilisées.

Voici ce que je vois (GDB semble fonctionner très bien):

$ 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

Le compilateur est sans doute du code ne génère pas même d'attribuer 12 à « un », ce serait une bonne idée de démonter le code généré pour confirmer. Vous avez probablement besoin d'un test un peu plus complexe pour l'essayer.

3

Lorsque vous voulez déboguer un programme que vous devez toujours construire avec -O0 -g3 (i prendre que vous utilisez gcc, Si vous n'êtes pas votre compilateur, il faudra probablement prendre en charge d'autres indicateurs pour désactiver l'optimisation et activer les informations de débogage).

Sur mon système (x86_64 fonctionnant sous Gentoo GNU/Linux) je n'arrive pas à atteindre la ligne 'int a = 12' lorsque j'utilise une optimisation supérieure ou égale à -O car le compilateur appliquera dead code elimination. (Retiré de here, il s'agit du drapeau -fdce dans la section -O)

Gardez toujours cela à l'esprit lorsque vous déboguez! Vérifiez votre code en le désassemblant avec objdump -D ou demandez à votre compilateur de vous montrer l'assembly généré (sur gcc avec l'indicateur -S)

Questions connexes