Debuggen im Assemblymodus

Wenn Sie über C- oder C++-Quelldateien für Ihre Anwendung verfügen, können Sie den Debugger viel leistungsfähiger verwenden, wenn Sie im Quellmodus debuggen.

Es gibt jedoch viele Male, dass Sie das Quelldebuggen nicht ausführen können. Möglicherweise verfügen Sie nicht über die Quelldateien für Ihre Anwendung. Möglicherweise debuggen Sie den Code einer anderen Person. Möglicherweise haben Sie Ihre ausführbaren Dateien nicht mit vollständigen PDB-Symbolen erstellt. Und selbst wenn Sie das Quelldebuggen für Ihre Anwendung durchführen können, müssen Sie möglicherweise Microsoft Windows-Routinen nachverfolgen, die Ihre Anwendung aufruft oder die zum Laden Ihrer Anwendung verwendet werden.

In diesen Situationen müssen Sie im Assemblymodus debuggen. Darüber hinaus verfügt der Assemblymodus über viele nützliche Features, die beim Quelldebuggen nicht vorhanden sind. Der Debugger zeigt automatisch den Inhalt der Speicherspeicherorte an und registriert sich, wenn darauf zugegriffen wird, und zeigt die Adresse des Programmzählers an. Diese Anzeige macht das Debuggen von Assemblys zu einem wertvollen Tool, das Sie zusammen mit dem Quelldebuggen verwenden können.

Disassemblierungscode

Der Debugger analysiert in erster Linie binären ausführbaren Code. Anstatt diesen Code im Rohformat anzuzeigen, disassembliert der Debugger diesen Code. Das heißt, der Debugger konvertiert den Code von der Computersprache in die Assemblysprache.

Sie können den resultierenden Code (auch als Disassemblierungscode bezeichnet) auf verschiedene Arten anzeigen:

  • Der Befehl u (Unassemble) disassembliert und zeigt einen angegebenen Abschnitt der Computersprache an.

  • Der Befehl uf (Unassemble Function) disassembliert und zeigt eine Funktion an.

  • Der Befehl up (Aus physischem Arbeitsspeicher aufheben) disassembliert und zeigt einen angegebenen Abschnitt der Computersprache an, der im physischen Speicher gespeichert wurde.

  • Der Befehl your (Unassemble Real Mode BIOS) disassembliert und zeigt einen angegebenen 16-Bit-Code im realen Modus an.

  • Der Befehl ux (Unassemble x86 BIOS) disassembliert die x86-basierte BIOS-Codeanweisung, die an einer angegebenen Adresse festgelegt ist, und zeigt sie an.

  • (Nur WinDbg) Das Disassemblierungsfenster disassembliert und zeigt einen angegebenen Abschnitt der Maschinensprache an. Dieses Fenster ist automatisch aktiv, wenn Sie im Fenstermenü den Automatisch geöffneten Disassemblierungsbefehl auswählen. Sie können dieses Fenster auch öffnen, indem Sie im Menü Ansichtdie Option Disassemblieren auswählen, ALT+7 drücken oder die Disassemblierungsschaltfläche (ALT+7) drücken.

Die Disassemblierungsanzeige wird in vier Spalten angezeigt: Adressoffset, Binärcode, mnemonische Assemblysprache und Details zur Assemblysprache. Das folgende Beispiel zeigt diese Anzeige.

0040116b    45          inc         ebp            
0040116c    fc          cld                        
0040116d    8945b0      mov         eax,[ebp-0x1c] 

Rechts neben der Zeile, die den aktuellen Programmzähler darstellt, zeigt die Anzeige die Werte aller Speicherspeicherorte oder Register an, auf die zugegriffen wird. Wenn diese Zeile eine Branchanweisung enthält, wird die Notation [br=1] oder [br=0] angezeigt. Diese Notation gibt einen Branch an, der bzw. nicht verwendet wird.

Sie können den Befehl .asm (Change Disassembly Options) verwenden, um zu ändern, wie die disassemblierten Anweisungen angezeigt werden.

Im Fenster Disassembly von WinDbg ist die Zeile hervorgehoben, die den aktuellen Programmzähler darstellt. Zeilen, in denen Haltepunkte festgelegt sind, werden ebenfalls hervorgehoben.

Sie können auch die folgenden Befehle verwenden, um Assemblycode zu bearbeiten:

  • Der Befehl # (Nach Disassemblierungsmuster suchen) durchsucht einen Bereich des Arbeitsspeichers nach einem bestimmten Muster. Dieser Befehl entspricht dem Durchsuchen der vier Spalten der Disassemblierungsanzeige.

  • Der Befehl a (Assemble) kann Assemblyanweisungen annehmen und in binären Computercode übersetzen.

Assemblymodus und Quellmodus

Der Debugger verfügt über zwei verschiedene Betriebsmodi: Assemblymodus und Quellmodus.

Wenn Sie eine Anwendung im einzelschrittigen Schritt durchlaufen, beträgt die Größe eines einzelnen Schritts je nach Modus eine Zeile Assemblycode oder eine Zeile Quellcode.

Mehrere Befehle erstellen je nach Modus unterschiedliche Datenanzeigen.

In WinDbg wird das Disassemblierungsfenster automatisch in den Vordergrund verschoben, wenn Sie eine Anwendung im Assemblymodus ausführen oder durchlaufen. Im Quellmodus wechselt das Quellfenster in den Vordergrund.

Um den Modus festzulegen, können Sie eine der folgenden Aktionen ausführen:

  • Verwenden Sie den Befehl l+, l- (Quelloptionen festlegen), um den Modus zu steuern. Der Befehl l-t aktiviert den Assemblymodus.

  • (Nur WinDbg) Deaktivieren Sie den Befehl Quellmodus im Menü Debuggen , damit der Debugger in den Assemblymodus wechselt. Sie können auch die Schaltfläche Quellmodus aus auf der Symbolleiste auswählen.

Wenn Sie sich in WinDbg im Assemblymodus befinden, wird ASM auf der status leiste angezeigt.

Das Kontextmenü im Fenster Disassembly von WinDbg enthält die Hervorhebungsanweisungen aus dem aktuellen Quellzeilenbefehl . Dieser Befehl hebt alle Anweisungen hervor, die der aktuellen Quellzeile entsprechen. Häufig entspricht eine einzelne Quellzeile mehreren Assemblyanweisungen. Wenn Der Code optimiert wurde, sind diese Assemblyanweisungen möglicherweise nicht aufeinander folgend. Mit den Anweisungen aus der aktuellen Quellzeile können Sie alle Anweisungen finden, die aus der aktuellen Quellzeile zusammengestellt wurden.

Quelldateien der Assemblysprache

Wenn Ihre Anwendung in der Assemblysprache geschrieben wurde, stimmt die vom Debugger erzeugte Disassemblierung möglicherweise nicht genau mit Ihrem ursprünglichen Code überein. Insbesondere werden NO-OPs und Kommentare nicht vorhanden sein.

Wenn Sie Ihren Code debuggen möchten, indem Sie auf die ursprünglichen ASM-Dateien verweisen, müssen Sie das Debuggen im Quellmodus verwenden. Sie können die Assemblydatei wie eine C- oder C++-Quelldatei laden. Weitere Informationen zu dieser Art des Debuggens finden Sie unter Debuggen im Quellmodus.