Frage

Ich halte fragen, wie funktioniert eine Debugger Arbeit? Besonders die, die ‚‘ angebracht werden können, um bereits ausführbare läuft. Ich verstehe, dass Compiler Code in Maschinensprache übersetzt, dann aber wie funktioniert Debugger ‚wissen‘, was es angebracht wird?

War es hilfreich?

Lösung

Die Einzelheiten, wie ein Debugger funktioniert hängt davon ab, was Sie debuggen, und was das Betriebssystem. Für nativen Debuggen unter Windows können Sie einige Details auf MSDN finden: Win32 Debugging API .

Der Benutzer teilt den Debugger, welcher Prozess zu anzubringen, entweder nach Namen oder nach Prozess-ID. Wenn es ein Name ist, dann wird der Debugger die Prozess-ID nachschlagen und die Debug-Sitzung über einen Systemaufruf initiieren; unter Windows würde dies Debugactiveprocess sein.

Sobald angebracht, wird der Debugger eine Ereignisschleife viel wie für jede UI, geben aber anstelle der Ereignisse aus dem Windowing-System kommen, wird das OS Ereignisse erzeugen basiert auf, was im Prozess geschieht gedebuggt - zum Beispiel eine Ausnahme auftritt. Siehe WaitForDebugEvent .

Der Debugger kann den Zielprozess virtuellen Speicher lesen und schreiben und sogar seine Registerwerte durch vom Betriebssystem bereitgestellt APIs anzupassen. Siehe die Liste der Debugging-Funktionen für Windows.

Der Debugger ist in der Lage Informationen von Symboldateien zu verwenden, um von Adressen zu Variablennamen und Orten in dem Quellcode zu übersetzen. Die Symboldatei Informationen ist ein separater Satz von APIs und ist kein Kernteil des OS als solche. Unter Windows ist dies durch die Debug Interface Access SDK rel="noreferrer">

Wenn Sie eine verwaltete Umgebung debuggen (.NET, Java, etc.) der Prozess wird in der Regel ähnlich aussehen, aber die Details sind unterschiedlich, wie die virtuelle Maschinenumgebung des Debug-API anstatt das zugrunde liegende Betriebssystem bereitstellt.

Andere Tipps

Wie ich verstehe es:

Für Software-Breakpoints auf x86, ersetzt der Debugger das erste Byte des Befehls mit CC ( int3 ). Dies geschieht mit WriteProcessMemory unter Windows. Wenn die CPU auf diese Instruktion erhält, und führt die int3 , bewirkt dies die CPU eine Debug-Ausnahme zu generieren. Das Betriebssystem empfängt diese Unterbrechung, erkennt den Prozess gedebuggt wird, und teilt den Debugger Prozess, der Haltepunkt erreicht wurde.

Nachdem der Haltepunkt erreicht wird und der Prozess gestoppt wird, sucht der Debugger in der Liste der Haltepunkte, und ersetzt die CC mit dem Byte, das es ursprünglich war. Der Debugger setzt TF, die Trap-Flag in EFLAGS (durch die CONTEXT ) und setzt den Prozess fort. Der Trap-Flag bewirkt, dass der CPU, um automatisch eine einstufiges Ausnahme zu erzeugen ( INT 1 ) auf dem nächste Anweisung.

Wenn der Prozess gedebuggt wird das nächste Mal stoppt, ersetzt der Debugger wieder das erste Byte des Unterbrechungspunkt-Befehls mit CC, und der Prozess wird fortgesetzt.

Ich bin mir nicht sicher, ob dies ist genau, wie es von allen Debugger implementiert ist, aber ich habe ein Win32-Programm geschrieben, das sich über diesen Mechanismus zu debuggen verwaltet. Völlig nutzlos, aber lehrreich.

In Linux, einen Prozess Debuggen beginnt mit dem ptrace (2) Systemaufruf. diesem Artikel ein großes Tutorial darauf hat, wie ptrace verwenden einige einfache Debugging-Konstrukte zu implementieren.

Wenn Sie auf einem Windows-Betriebssystem sind, eine große Ressource für diese wäre „Debuggen von Anwendungen für Microsoft .NET und Microsoft Windows“ von John Robbins:

(oder sogar die ältere Ausgabe: "Debuggen von Anwendungen" )

Das Buch hat ein Kapitel über, wie eine Debugger Arbeit, den Code für ein paar einfache (aber die Arbeit) Debugger enthält.

Da ich mit Details von Unix / Linux-Debugging nicht vertraut bin, kann dieses Material überhaupt auf andere Betriebssysteme nicht zur Anwendung. Aber ich würde vermuten, dass als Einführung in ein sehr komplexen Thema der Konzepte - wenn nicht die Details und APIs -. Sollte ‚Hafen‘ für das meist jedes Betriebssystem

Eine weitere wertvolle Quelle Debugging zu verstehen ist Intel CPU-Handbuch (Intel® 64 und IA-32 Architektur Software Developer Manual). In dem Band 3A, Kapitel 16, führte sie die Hardware-Unterstützung der Fehlersuche, wie spezielle Ausnahmen und Hardware-Debugging-Register. Im Anschluss an dieses Kapitel ist:

T (Trap) Flag, TSS - Erzeugt eine Debug-Ausnahme (#DB), wenn ein Versuch ist, aus einer Aufgabe mit dem T-Flag in seiner TSS gesetzt zu wechseln.

Ich bin nicht sicher, ob Fenster oder Linux verwenden diesen Flag oder nicht, aber es ist sehr interessant, dieses Kapitel zu lesen.

Hope, das hilft jemand.

Mein Verständnis ist, dass, wenn Sie eine Anwendung oder DLL-Datei kompilieren, was auch immer es kompiliert enthält Symbole für die Funktionen und die Variablen.

Wenn Sie eine Debug-Build haben, sind diese Symbole weit ausführlicher als wenn es eine Release-Build, wodurch der Debugger ermöglicht Ihnen weitere Informationen zu geben. Wenn Sie den Debugger an einen Prozess anhängen, sieht es an, welche Funktionen momentan zugegriffen wird und löst alle verfügbaren Debug-Symbole von hier (da sie weiß, was die Interna der kompilierte Datei aussieht, kann es acertain was im Speicher sein könnte , mit Gehalten von ints, Schwimmern, Strings, etc.). Wie das erste Plakat sagte, diese Informationen und wie diese Symbole stark arbeiten, hängt von der Umgebung und der Sprache.

Ich denke, es gibt zwei Hauptfragen hier zu beantworten:

1. Wie der Debugger weiß, dass eine Ausnahme aufgetreten?

Wenn eine Ausnahme in einem Prozess auftritt, den debuggt ist wird, wird der Debugger durch das Betriebssystem, bevor Benutzer Exception-Handler in dem Zielprozess definiert benachrichtigt eine Chance gegeben werden, auf die Ausnahme zu reagieren. Wenn der Debugger diese (first-Chance) Ausnahmebenachrichtigung nicht zu handhaben wählt, die Ausnahme-Sequenz Dispatching weiter fortschreitet und das Ziel Faden wird dann die Möglichkeit gegeben, um die Ausnahme zu behandeln, wenn er dies zu tun wünscht. Wenn die SEH Ausnahme nicht vom Zielprozess behandelt wird, wird der Debugger gesendet dann ein weiteres Debug-Ereignis, eine so genannte Second-Chance-Benachrichtigung, es zu informieren, dass eine nicht behandelte Ausnahme in dem Zielprozess aufgetreten ist. Quelle


2. Wie der Debugger weiß, wie auf einem Haltepunkt zu stoppen?

Das vereinfachte beantworten ist: Wenn Sie einen Stützpunkt in das Programm gesetzt, die Debugger Code an dieser Stelle mit einem int3 Befehl, der ein Software-Interrupt . Als Effekt wird das Programm unterbrochen und der Debugger aufgerufen wird.

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