Sehen Sie sich einen Speicherbereich in gdb an?

Lesezeit: 3 Minuten

Benutzer-Avatar
iblau

Ich debugge ein Programm in gdb und möchte, dass das Programm stoppt, wenn auf den Speicherbereich 0x08049000 bis 0x0804a000 zugegriffen wird. Wenn ich versuche, Speicherhaltepunkte manuell zu setzen, scheint gdb nicht mehr als zwei Speicherorte gleichzeitig zu unterstützen.

(gdb) awatch *0x08049000
Hardware access (read/write) watchpoint 1: *0x08049000
(gdb) awatch *0x08049001
Hardware access (read/write) watchpoint 2: *0x08049001
(gdb) awatch *0x08049002
Hardware access (read/write) watchpoint 3: *0x08049002
(gdb) run
Starting program: /home/iblue/git/some-code/some-executable
Warning:
Could not insert hardware watchpoint 3.
Could not insert hardware breakpoints:
You may have requested too many hardware breakpoints/watchpoints.

Es gibt bereits eine Frage, wo dies gestellt wurde und die Antwort war, dass dies möglicherweise mit Valgrind möglich ist. Leider enthält die Antwort keine Beispiele oder Verweise auf das Valgrind-Handbuch, daher war sie nicht sehr aufschlussreich: Wie kann gdb verwendet werden, um nach Änderungen in einem gesamten Speicherbereich zu suchen?

Also: Wie kann ich mir den gesamten Speicherbereich ansehen?

  • Interessante Tatsache: PowerPC hat Ranged Breakpoints (aber keine Watchpoints?): stackoverflow.com/questions/13410941/…

    – Ciro Santilli OurBigBook.com

    27. Juli 2015 um 16:09 Uhr

  • x86 unterstützt kleine Überwachungsbereiche bis zu 8 Bytes: en.wikipedia.org/wiki/X86_debug_register

    – Ciro Santilli OurBigBook.com

    12. August 2015 um 12:09 Uhr

Benutzer-Avatar
promov

Wenn Sie GDB 7.4 zusammen mit Valgrind 3.7.0 verwenden, haben Sie unbegrenzt “emulierte” Hardware-Watchpoints.

Starten Sie Ihr Programm unter Valgrind und geben Sie die Argumente an
--vgdb=full --vgdb-error=0
Verwenden Sie dann GDB, um eine Verbindung herzustellen (target remote | vgdb). Dann kannst du zb watch oder awatch oder rwatch ein Speicherbereich, indem Sie tun
rwatch (char[100]) *0x5180040

Sehen das Valgrind-Benutzerhandbuch zur GDB-Integration für mehr Details

  • Nachdem ich den größten Teil des Tages damit verbracht hatte, damit herumzuspielen mprotect und SIGSEV-Handler zu missbrauchen, um den Speicherzugriff zu unterbrechen, habe ich dies versucht. Es funktioniert perfekt. Du hast meinen Tag gerettet. Vielen Dank!

    – iblau

    13. Juni 2012 um 23:00 Uhr

  • Ja, +1 auch. Ich suche seit Monaten nach so einer Funktion.

    – Absturz

    14. Juni 2012 um 0:10 Uhr

  • Wie ermittelt man also die Heap-Adresse für den von valgrind gestarteten Prozess? Ich mache das meistens per /proc/[pid]/Karten aber wenn ich python über diesen valgrind-Befehl starte, hat die Maps-Datei keinen Eintrag, der durch identifiziert wird [heap] wie ich es gewohnt bin zu finden.

    – Andrew Falanga

    11. Februar 2016 um 19:59 Uhr


  • Mir ist klar, dass diese Antwort vor langer Zeit geschrieben wurde, aber ich bin verwirrt von dieser Antwort, weil gdb das selbst tun kann, ohne die Hilfe von valgrind. Zumindest kann es jetzt. Es wird auf einen Einzelschritt zurückgegriffen und wiederholt überprüft. Das ist offensichtlich sehr teuer (wie es Valgrind ist), also würden Sie es auf den Zeitpunkt eingrenzen, an dem die Beschädigung bald auftreten wird, und dann den Watchpoint erstellen, damit es nicht während des gesamten Debug-Laufs langsam läuft.

    – doug65536

    10. Dezember 2020 um 3:40 Uhr


Die Funktion, die erkennt, wenn sich eine Speicheradresse geändert hat, wird aufgerufen ein Hardware-Haltepunkt, und es ist eigentlich eine Funktion der CPU – ein Register innerhalb des Speichercontrollers, das erkennt, wenn auf eine bestimmte Adresse zugegriffen wird, und einen Debugger-Break-Interrupt auslöst. Leider die x86-Architektur hat nur vier solcher Register Aus diesem Grund ist die Anzahl der Haltepunkte für die Speicherüberwachung begrenzt, die Sie festlegen können.

Deshalb müssen Sie so etwas wie valgrind verwenden; Wenn Sie eine ganze Region sehen möchten, müssen Sie dies mit einer Software tun, die die Speicherzugriffsmuster simuliert. Ich weiß jedoch nicht, ob Valgrind tatsächlich das Überwachen ganzer Speicherbereiche unterstützt. Möglicherweise müssen Sie es selbst patchen. Modifizieren Sie VALGRIND_MAKE_MEM_NOACCESS(), um einen Haltepunkt zu werfen, aber erlauben Sie dann vielleicht, dass das Programm fortfährt.

1382520cookie-checkSehen Sie sich einen Speicherbereich in gdb an?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy