Wie ein Debugger im Detail funktioniert, hängt davon ab, was Sie debuggen wollen und welches Betriebssystem Sie verwenden. Für das native Debugging unter Windows finden Sie einige Details auf MSDN: Win32-Debugging-API .
Der Benutzer teilt dem Debugger mit, an welchen Prozess er sich anhängen soll, entweder über den Namen oder über die Prozess-ID. Wenn es sich um einen Namen handelt, wird der Debugger die Prozess-ID nachschlagen und die Debug-Sitzung über einen Systemaufruf initiieren; unter Windows wäre dies DebugActiveProcess .
Sobald der Debugger angehängt ist, tritt er in eine Ereignisschleife ein, ähnlich wie bei jeder Benutzeroberfläche, aber anstelle von Ereignissen, die vom Fenstersystem kommen, erzeugt das Betriebssystem Ereignisse auf der Grundlage dessen, was in dem zu debuggenden Prozess passiert - zum Beispiel das Auftreten einer Ausnahme. Siehe WaitForDebugEvent .
Der Debugger ist in der Lage, den virtuellen Speicher des Zielprozesses zu lesen und zu schreiben und sogar seine Registerwerte über vom Betriebssystem bereitgestellte APIs anzupassen. Siehe die Liste der Debugging-Funktionen für Windows.
Der Debugger ist in der Lage, Informationen aus Symboldateien zu verwenden, um Adressen in Variablennamen und Speicherstellen im Quellcode zu übersetzen. Die Informationen aus den Symboldateien sind ein separater Satz von APIs und kein Kernbestandteil des Betriebssystems als solches. Unter Windows erfolgt dies über die Debug Interface Access SDK .
Wenn Sie eine verwaltete Umgebung (.NET, Java usw.) debuggen, sieht der Prozess in der Regel ähnlich aus, aber die Details sind anders, da die Umgebung der virtuellen Maschine die Debug-API bereitstellt und nicht das zugrunde liegende Betriebssystem.
9 Stimmen
Eli's Artikel wurde verschoben nach eli.thegreenplace.net/2011/01/23/wie-debugger-arbeiten-teil-1
2 Stimmen
@Oktalist Dieser Artikel ist interessant, spricht aber nur über die Abstraktion auf API-Ebene für das Debugging unter Linux. Ich vermute, dass OP mehr über das Innenleben wissen möchte.