2008-09-12 4 views
198

J'utilise une application via gdb et je souhaite définir un point d'arrêt à chaque fois qu'une variable spécifique est accédée/modifiée. Y a-t-il une bonne méthode pour le faire? Je serais également intéressé par d'autres façons de surveiller une variable en C/C++ pour voir si/quand il change.Puis-je définir un point d'arrêt sur 'l'accès mémoire' dans GDB?

Répondre

240

montre ne se casse à l'écriture, rwatch vous permettent de briser le lire, et awatch vous laissez pause sur lecture/écriture.

Vous pouvez définir lire watchpoints sur les emplacements mémoire:

gdb$ rwatch *0xfeedface 
Hardware read watchpoint 2: *0xfeedface 

mais une limitation s'applique aux commandes rwatch et Awatch; vous ne pouvez pas utiliser des variables gdb dans les expressions:

gdb$ rwatch $ebx+0xec1a04f 
Expression cannot be implemented with read/access watchpoint. 

donc vous devez les développer vous-même:

gdb$ print $ebx 
$13 = 0x135700 
gdb$ rwatch *0x135700+0xec1a04f 
Hardware read watchpoint 3: *0x135700 + 0xec1a04f 
gdb$ c 
Hardware read watchpoint 3: *0x135700 + 0xec1a04f 

Value = 0xec34daf 
0x9527d6e7 in objc_msgSend() 

Edit: Oh, et par la manière. Vous avez besoin du matériel ou du support logiciel. Le logiciel est évidemment beaucoup plus lent. Pour savoir si votre système d'exploitation prend en charge les points de surveillance matériels, vous pouvez voir le paramètre d'environnement can-use-hw-watchpoints.

gdb$ show can-use-hw-watchpoints 
Debugger's willingness to use watchpoint hardware is 1. 
+5

Si vous voulez regarder un membre d'une méthode C++, j'ai trouvé cette variante immensément utile: 'watch -location mTextFormatted'. –

+0

Et si je n'ai pas l'adresse d'une variable? Puis-je utiliser son nom? –

+5

Vous pouvez demander à GDB d'imprimer l'adresse de la variable avec l'opérateur address-of. 'print & variable' – Loduwijk

9

Je viens d'essayer ce qui suit:

$ cat gdbtest.c 
int abc = 43; 

int main() 
{ 
    abc = 10; 
} 
$ gcc -g -o gdbtest gdbtest.c 
$ gdb gdbtest 
... 
(gdb) watch abc 
Hardware watchpoint 1: abc 
(gdb) r 
Starting program: /home/mweerden/gdbtest 
... 

Old value = 43 
New value = 10 
main() at gdbtest.c:6 
6  } 
(gdb) quit 

Il semble donc possible, mais vous ne semblent avoir besoin d'un support matériel.

+0

Si votre plate-forme ne prend pas en charge les points de surveillance matériels, gdb doit revenir à un point de surveillance logiciel. – Tod

22

En supposant que la première réponse fait référence à la syntaxe C comme (char *)(0x135700 +0xec1a04f) alors la réponse à faire rwatch *0x135700+0xec1a04f est incorrect. La syntaxe correcte est rwatch *(0x135700+0xec1a04f).

L'absence de () s m'a fait beaucoup de mal à essayer d'utiliser les points de surveillance moi-même.

1

Utilisez la fonction de surveillance pour voir quand une variable est écrite, rwatch lorsqu'elle est lue et awatch lorsqu'elle est lue/écrite depuis/vers, comme indiqué ci-dessus. Toutefois, notez que pour utiliser cette commande, vous devez rompre le programme et la variable doit être dans la portée lorsque vous avez rompu le programme:

Utilisez la commande watch. L'argument de la commande watch est une expression évaluée. Cela implique que le variabel que vous voulez pour définir un point de surveillance doit être dans la portée actuelle. Ainsi, pour définir un point de contrôle sur une variable non globale, vous devez avoir défini un point d'arrêt qui arrêtera votre programme lorsque la variable est dans la portée. Vous définissez le point de contrôle après les pauses du programme.

14

Qu'est-ce que vous cherchez est appelé point d'observation.

Utilisation

(gdb) watch foo: regarder la valeur de variablesfoo

(gdb) watch *(int*)0x12345678: regarder la valeur pointée par une adresse, casté à tout type que vous voulez

(gdb) watch a*b + c/d: montre arbitrairement expression complexe, va couvercle dans la langue maternelle du programme

Les points d'observation sont de trois types:

  • montre: gdb se brisera quand un écriture se
  • rwatch: gdb cassera wnen une lire se produit
  • awatch: gdb se casse les deux cas

Vous pouvez choisir le plus approprié pour vos besoins.

Pour plus d'informations, consultez this.

+3

J'ai écrit ** une autre ** réponse parce que les existantes ne me semblaient pas très simples ... –

Questions connexes