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.
Réponses
Trop de publicités?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.
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.