Kann ich einen Haltepunkt auf ‚Speicherzugriff‘ in GDB eingestellt?
-
09-06-2019 - |
Frage
ich eine Anwendung durch gdb leite und ich möchte eine bestimmte Variable einen Haltepunkt für jede Zeit eingestellt zugegriffen / geändert. Gibt es eine gute Methode, dies zu tun? Ich würde auch auf andere Weise daran interessiert sein, eine Variable in C / C ++ zu überwachen, um zu sehen, ob / wann sie sich ändert.
Lösung
sehen bricht nur auf Schreib, rwatch können Sie auf Lese brechen und awatch können Sie brechen auf Lesen / Schreiben.
Sie können die Lesebeobachtungspunkte an Speicherplatz gesetzt:
gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface
aber eine Einschränkung gilt für die rwatch und awatch Befehle; Sie können nicht GDB-Variablen verwenden in Ausdrücken:
gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.
So haben Sie sie 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 müssen entweder Hardware oder Software-Support . Software ist natürlich viel langsamer. Um herauszufinden, ob Ihr OS Hardware Beobachtungspunkte unterstützt, können Sie sehen die can-use-hw-Beobachtungspunkte Umgebungseinstellung.
gdb$ show can-use-hw-watchpoints
Debugger's willingness to use watchpoint hardware is 1.
Andere Tipps
Unter der Annahme, die erste Antwort auf die C-ähnliche Syntax (char *)(0x135700 +0xec1a04f)
bezieht dann die Antwort zu tun rwatch *0x135700+0xec1a04f
falsch ist. Die korrekte Syntax ist rwatch *(0x135700+0xec1a04f)
.
Der Mangel an ()
s es hat mich sehr viel Schmerz versuchen Beobachtungspunkte selbst zu verwenden.
Was Sie suchen eine Beobachtungspunkt genannt wird.
Verwendung
(gdb) watch foo
: sehen den Wert von Variable foo
(gdb) watch *(int*)0x12345678
: der Wert sieht durch eine Adresse weist , gegossen zu welcher Art auch immer Sie wollen
(gdb) watch a*b + c/d
: watch einen beliebig komplexer Ausdruck , gültig in der Muttersprache des Programms
Beobachtungspunkte sind von drei Arten:
- sehen : GDB wird brechen, wenn ein write tritt auf
- rwatch : GDB bricht wnen a lesen kommt
- awatch : GDB bricht in In beiden Fällen
Sie können das besser geeignet für Ihre Bedürfnisse.
Für weitere Informationen besuchen Sie diese aus.
Ich habe gerade versucht, die folgenden:
$ 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
So scheint es möglich, aber Sie scheinen einige Hardware-Unterstützung zu benötigen.
Verwenden Sie beobachten, um zu sehen, wenn eine Variable, rwatch geschrieben wird, wenn es gelesen wird und awatch, wenn es von / bis gelesen / geschrieben wird, wie oben erwähnt. Aber bitte beachten, dass Sie diesen Befehl zu verwenden, müssen Sie das Programm brechen, und die Variablen in Umfang sein muss, wenn Sie das Programm gebrochen haben:
Mit dem Befehl watch. Das Argument der Uhr Befehl ein Ausdruck, der ausgewertet wird. Dies bedeutet, dass die Variabel Sie wollen Beobachtungspunkte setzen auf im aktuellen Bereich sein muss. Also, setzen ein Beobachtungspunkt auf einer nicht-globalen Variablen, müssen Sie einen Haltepunkt festgelegt haben das wird Ihr Programm stoppen, wenn die Variable im Gültigkeitsbereich befindet. Sie setzen die Beobachtungspunkt, nachdem das Programm bricht.