2016-06-24 6 views
0

Ich sehe, dass es in GDB möglich ist, einen Haltepunkt zu setzen, der ausgelöst wird, wenn eine bestimmte Speicheradresse gelesen oder geschrieben wird. Ich frage mich, wie es funktioniert. Hat GDB eine Art Kopie des Prozessspeichers und überprüft, was sich zwischen den einzelnen Anweisungen geändert hat? Oder ist es eine Syscall- oder Kernel-Funktion dafür?Wie funktionieren GDB rwatch und awatch Befehle?

(Intel x86 32 und 64-Bit-Architektur)

+0

Was ist das Ziel? Zielarchitektur und wie gdb darauf läuft (oder remote)? Ist es x86 + Linux und gdb auf dem gleichen Rechner? Überprüfen Sie die "Watchpoint" -Funktion von gdb: https://sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints.html - es funktioniert möglicherweise mit Hardware-Debug-Registern (auf einigen Zielen; Hardware Watchpoint) oder langsamen Software-Watchpoints, implementiert als Einfaches Programmieren und Lesen des Speichers mit ptrace (unter Linux kann es sowohl für das Einzelschrittverfahren als auch für das Lesen des Speichers verwendet werden). Es ist theoretisch möglich, Software-Watchpoints mit mprotect PROT_NONE zu beschleunigen und SEGVs zu fangen. – osgx

+0

Ich kenne 'rtrace' oder 'atrace' gdb Befehle nicht. Was war Ihr "Haltepunkt im Speicher lesen/schreiben" Befehl? – osgx

+0

Sorry, ich meine rwatch und awatch – Bob5421

Antwort

1

Ich frage mich, wie es funktioniert.

Es gibt zwei Möglichkeiten: Software-Watchpoints und Hardware-Watchpoints (nur bei einigen Architekturen verfügbar).

Software-Überwachungspunkte funktionieren, indem die Anwendung einzeln gestartet und geprüft wird, ob sich der Wert nach jeder Anweisung geändert hat. Diese sind schmerzhaft langsam (1000x langsamer) und sind in der Praxis für nichts anderes als ein Spielzeugprogramm verwendbar. Sie können auch keinen Zugriff erkennen, sondern nur den Wert im überwachten Ort ändern.

Hardware-Watchpoints erfordern Prozessorunterstützung. Intel x86-Chips haben debug registers, die so programmiert werden könnten, dass sie nach einem Zugriff (awatch, rwatch) oder einem bestimmten Speicherort (watch) suchen. Wenn der Prozessor erkennt, dass auf den interessierenden Ort zugegriffen worden ist, löst er eine Debug-Ausnahme aus, die das Betriebssystem in ein Signal übersetzt, und (wie üblich) wird dem Debugger ein Signal gegeben, bevor das Ziel es sieht.

HW Watchpoints werden mit nativer Geschwindigkeit ausgeführt, aber (auf x86) können Sie nur bis zu 4 verschiedene Adressen haben (in der Praxis habe ich nie mehr als 2 benötigt).

Führt die Ausführung der aktuellen Anweisung eine Uhr an der EIP-Adresse lesen?

Es sollte. Sie könnten dies selbst trivial beantworten. Probier es einfach.

Stößt der Stack-Stack einen Schreibzugriff auf die Speicheradresse des Stacks?

Ebenso.

+0

Ist die Ausführung der aktuellen Anweisung eine Uhr an der EIP-Adresse lesen? Stößt der Stack-Stack einen Schreibzugriff auf die Speicheradresse des Stacks? – Bob5421

+0

@ Bob5421 Antwort aktualisiert. Sie sollten nicht wirklich Fragen stellen, um eine Antwort zu finden, die Sie alle 2 Minuten dauern wird. –

Verwandte Themen