Question

J'exécute 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.Existe-t-il une bonne méthode pour procéder?Je serais également intéressé par d'autres moyens de surveiller une variable en C/C++ pour voir si/quand elle change.

Était-ce utile?

La solution

montre ne s'arrête qu'à l'écriture, regarder laissez-vous faire une pause pour lire, et une montre laissez-vous arrêter en lecture/écriture.

Vous pouvez définir des points de surveillance de lecture sur des 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 les variables GDB dans les expressions:

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

Vous devez donc 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 ()

Modifier: Oh, et au fait.Vous avez besoin soit du matériel ou 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 consulter le peut-utiliser-hw-watchpoints réglage de l’environnement.

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

Autres conseils

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

Le manque de ()Cela m'a causé beaucoup de douleur en essayant d'utiliser moi-même les points de surveillance.

Ce que vous recherchez s'appelle un point de surveillance.

Usage

(gdb) watch foo:surveiller la valeur de variable foo

(gdb) watch *(int*)0x12345678:regardez la valeur indiquée par un adresse, converti dans le type de votre choix

(gdb) watch a*b + c/d:regarder un arbitrairement expression complexe, valable dans la langue maternelle du programme

Les points de surveillance sont de trois sortes :

  • montre:gdb se brisera quand un écrire se produit
  • regarder:gdb va se briser quand un lire se produit
  • une montre:gdb va entrer par effraction les deux cas

Vous pouvez choisir celui qui convient le mieux à vos besoins.

Pour plus d'informations, consultez ce dehors.

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

Cela semble donc possible, mais vous semblez avoir besoin d'un support matériel.

Utilisez watch pour voir quand une variable est écrite, rwatch quand elle est lue et awatch quand elle est lue/écrite depuis/vers, comme indiqué ci-dessus.Cependant, veuillez noter que pour utiliser cette commande, vous devez interrompre le programme et que la variable doit être dans la portée lorsque vous avez interrompu le programme :

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top