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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top