ne regardez que les pauses en écriture, rwatch vous permet de faire une pause en lecture et awatch vous permet de pauses en lecture / écriture.
Vous pouvez définir des points de lecture 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 de 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 ()
Edit: Oh, et au fait. Vous avez besoin d'un support matériel ou 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.
watch -location mTextFormatted
.print &variable
watch
commandes. En attendant, c'est la première question qui me vient à l'esprit après avoir lu ce qui précède. Combien d'octetsrwatch *0xfeedface
regarderont réellement?rwatch *(int *)0xfeedface
et il regardera lessizeof(int)
octets: sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints. htmlCe que vous recherchez s'appelle un point d' observation .
Usage
(gdb) watch foo
: surveiller la valeur de la variablefoo
(gdb) watch *(int*)0x12345678
: regardez la valeur pointée par une adresse , castée dans le type que vous voulez(gdb) watch a*b + c/d
: regarder une expression arbitrairement complexe , valide dans la langue maternelle du programmeLes points d'observation sont de trois types:
Vous pouvez choisir le plus approprié à vos besoins.
Pour plus d'informations, consultez ceci .
la source
En supposant que la première réponse se réfère à la syntaxe de type C,
(char *)(0x135700 +0xec1a04f)
la réponse à fairerwatch *0x135700+0xec1a04f
est incorrecte. La syntaxe correcte estrwatch *(0x135700+0xec1a04f)
.Le manque de
()
s là m'a causé beaucoup de douleur en essayant d'utiliser moi-même les points d'observation.la source
Je viens d'essayer ce qui suit:
Cela semble donc possible, mais vous semblez avoir besoin d'un support matériel.
la source
Utilisez watch pour voir quand une variable est écrite, rwatch lorsqu'elle est lue et awatch lorsqu'elle est lue / écrite de / vers, comme indiqué ci-dessus. Cependant, veuillez noter que pour utiliser cette commande, vous devez interrompre le programme et la variable doit être dans la portée lorsque vous avez interrompu le programme:
la source