Beobachten Sie nur Pausen beim Schreiben, Rwatch lässt Sie beim Lesen brechen und Awatch lässt Sie beim Lesen / Schreiben brechen.
Sie können Leseüberwachungspunkte an Speicherorten festlegen:
gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface
Eine Einschränkung gilt jedoch für die Befehle rwatch und awatch. Sie können keine GDB-Variablen in Ausdrücken verwenden:
gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.
Sie müssen sie also selbst erweitern:
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, und übrigens. Sie benötigen entweder Hardware- oder Softwareunterstützung . Software ist offensichtlich viel langsamer. Um herauszufinden, ob Ihr Betriebssystem Hardware-Überwachungspunkte unterstützt, sehen Sie die Umgebungseinstellung 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
Befehlen überwacht wird . In der Zwischenzeit ist dies die erste Frage, die nach dem Lesen der obigen Informationen in den Sinn kommt. Wie viele Bytesrwatch *0xfeedface
werden tatsächlich angezeigt?rwatch *(int *)0xfeedface
und es werdensizeof(int)
Bytes überwachtWas Sie suchen, wird als Überwachungspunkt bezeichnet .
Verwendung
(gdb) watch foo
: Beobachten Sie den Wert der Variablenfoo
(gdb) watch *(int*)0x12345678
: Beobachten Sie den Wert, auf den eine Adresse zeigt , die in einen beliebigen Typ umgewandelt wurde(gdb) watch a*b + c/d
: Beobachten Sie einen beliebig komplexen Ausdruck , der in der Muttersprache des Programms gültig istEs gibt drei Arten von Überwachungspunkten:
Sie können die für Ihre Bedürfnisse geeignetere auswählen.
Für weitere Informationen besuchen Sie diese aus.
quelle
Angenommen, die erste Antwort bezieht sich auf die C-ähnliche Syntax,
(char *)(0x135700 +0xec1a04f)
dann ist die zu erledigende Antwortrwatch *0x135700+0xec1a04f
falsch. Die richtige Syntax lautetrwatch *(0x135700+0xec1a04f)
.Das Fehlen von
()
s dort verursachte mir große Schmerzen beim Versuch, selbst Überwachungspunkte zu verwenden.quelle
Ich habe gerade Folgendes versucht:
Es scheint also möglich, aber Sie scheinen Hardware-Unterstützung zu benötigen.
quelle
Verwenden Sie watch, um zu sehen, wann eine Variable geschrieben wird, rwatch, wenn sie gelesen wird, und awatch, wenn sie von / nach gelesen / geschrieben wird, wie oben angegeben. Beachten Sie jedoch, dass Sie zur Verwendung dieses Befehls das Programm unterbrechen müssen und die Variable im Gültigkeitsbereich sein muss, wenn Sie das Programm unterbrochen haben:
quelle