258 votes

Je peux définir un point d’arrêt sur ' accès mémoire ' dans GDB ?

J’exécute une application via gdb et je tiens à mettre un point d’arrêt pour n’importe quel moment une variable spécifique est accessible / changée. Y a-t-il une bonne méthode pour y parvenir ? Je serais également intéressé par d’autres moyens de surveiller une variable en C/C++ pour voir si/quand qu'il change.

303voto

asksol Points 9574

regarder ne le viole qu'à écrire, rwatch vous permettent de pause à la lecture, et aveillez vous permettent de pause de lecture/écriture.

Vous pouvez définir la lecture de points d'observation sur les emplacements mémoire:

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

mais une limitation s'applique à la rwatch et aveillez commandes; vous ne pouvez pas utiliser gdb variables dans les expressions:

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

Donc, vous avez à 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 de matériel ou de logiciel de soutien. Le logiciel est évidemment beaucoup plus lent. Pour savoir si votre système d'exploitation prend en charge matérielle de points d'observation, vous pouvez voir la pouvez-utilisation-hw-les points d'observation paramètre d'environnement.

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

25voto

Smirnov Points 156

En supposant que la première réponse se rapporte à la syntaxe C-like ensuite la réponse à faire est incorrect. La syntaxe correcte est `` .

Le manque de `` s il m’a causé beaucoup de douleur, essayant d’utiliser watchpoints moi-même.

9voto

mweerden Points 4291

Je viens d’essayer ce qui suit :

Il semble donc possible, mais vous ne semblez pas besoin de soutien matériel.

1voto

Tyler Points 16516

Censé être un Espion peut vous aider, mais ma version de gdb sur ma plate-forme ne supporte pas cette fonction (c'est-à-dire je pense ils moitiéent-écrit la fonction pour gdb sache quelles sont watchpoints, mais ils ne fonctionnent pas « encore »).

Edit: comme d’autres l’ont fait remarquer, même agglomérés watchpoints travailler pour vous apparemment dépend de soutien spécifiques au matériel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X