Question Puis-je définir un point d'arrêt sur «accès mémoire» dans GDB?


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 accessible / modifiée. Y a-t-il une bonne méthode pour le faire? Je serais également intéressé par d'autres moyens de surveiller une variable en C / C ++ pour voir si / quand elle change.


203
2017-09-12 12:46


origine


Réponses:


regarder seulement des pauses à l'écriture, rwatch laissez vous cassez lire, et une montre laissez-vous rompre en lecture / écriture.

Vous pouvez définir la lecture des points de surveillance sur les emplacements de 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 de 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 voir le can-use-hw-watchpoints réglage de l'environnement.

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

245
2017-09-12 14:35



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

Le manque de ()s il y a eu beaucoup de douleur en essayant d'utiliser moi-même des points d'observation.


23
2018-06-08 19:26



Ce que vous cherchez s'appelle un point de vue.

Usage 

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

(gdb) watch *(int*)0x12345678: regarder la valeur pointée par un adresse, moulé à n'importe quel type que vous voulez

(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 types:

  • regarder: gdb va casser quand un écrire se produit
  • rwatch: gdb va briser un lis se produit
  • une montre: gdb va céder les deux cas

Vous pouvez choisir le plus approprié à vos besoins.

Pour plus d'informations, vérifiez ce en dehors.


17
2017-07-03 08:53



J'ai juste essayé 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

Donc, cela semble possible, mais vous semblez avoir besoin de support matériel.


9
2017-09-12 13:00



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. Toutefois, notez que pour utiliser cette commande, vous devez rompre le programme et la variable doit être étendue lorsque vous avez interrompu le programme:

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


1
2018-06-26 16:05