Gewusst wie: Debuggen von optimiertem Code

Dieses Thema gilt für folgende Anwendungsbereiche:

Edition

Visual Basic

C#

F#

C++

Web Developer

Express

Thema ist nicht vorhanden Thema ist nicht vorhanden Thema ist nicht vorhanden

Nur "Systemeigen"

Thema ist nicht vorhanden

Pro, Premium und Ultimate

Thema ist nicht vorhanden Thema ist nicht vorhanden Thema ist nicht vorhanden

Nur "Systemeigen"

Thema ist nicht vorhanden

Tipp

Je nach den aktiven Einstellungen oder der Version unterscheiden sich die Dialogfelder und Menübefehle auf Ihrem Bildschirm möglicherweise von den in der Hilfe beschriebenen. Klicken Sie im Menü Extras auf Einstellungen importieren und exportieren, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Arbeiten mit Einstellungen.

Wenn der Compiler Code optimiert, werden die Anweisungen neu positioniert und organisiert. Hierdurch wird die Effizienz des kompilierten Codes erhöht. Aufgrund dieser Neuanordnung ist der Debugger nicht immer in der Lage, den Quellcode, der einer bestimmten Gruppe von Anweisungen entspricht, zu erkennen.

Durch die Optimierung können folgende Bereiche beeinflusst werden:

  • Lokale Variablen, die durch den Optimierer entfernt oder an Speicherorte verschoben werden können, die vom Debugger nicht erkannt werden.

  • Positionen in einer Funktion, die geändert werden, wenn Codeblöcke durch den Optimierer zusammenführt werden.

  • Funktionsnamen für Rahmen der Aufrufliste, die möglicherweise falsch sind, wenn der Optimierer zwei Funktionen zusammenführt.

Die in der Aufrufliste angezeigten Rahmen sind fast immer korrekt, vorausgesetzt, es sind für alle Rahmen Symbole vorhanden. Die Rahmen der Aufrufliste sind falsch, wenn die Aufrufliste beschädigt ist, wenn Funktionen in der Assemblysprache geschrieben wurden oder wenn es sich um Betriebssystemrahmen ohne entsprechende Symbole in der Aufrufliste handelt.

Globale und statische Variablen werden immer richtig angezeigt. Dies trifft auch auf das Strukturlayout zu. Wenn ein Zeiger auf eine Struktur vorhanden und der Wert des Zeigers richtig ist, zeigt jede Membervariable der Struktur den richtigen Wert an.

Aufgrund dieser Einschränkungen müssen Debugoperationen, wenn überhaupt möglich, unter Verwendung einer nicht optimierten Version des Programms erfolgen. In der Debugkonfiguration eines Visual C++-Programms ist die Optimierung standardmäßig deaktiviert, während sie in der Releasekonfiguration aktiviert ist.

Ein Fehler ist jedoch nur in einer optimierten Programmversion erkennbar. In diesem Fall muss der optimierte Code gedebuggt werden.

So aktivieren Sie die Optimierung in einer Debugbuildkonfiguration

  1. Wählen Sie beim Erstellen eines neuen Projekts Win32 Debug als Ziel aus. Verwenden Sie das Win32Debug-Ziel, bis das Programm vollständig gedebuggt und für die Erstellung eines Win32 Release-Ziels bereit ist. Das Win32 Debug-Ziel wird nicht vom Compiler optimiert.

  2. Wählen Sie das Projekt im Projektmappen-Explorer aus.

  3. Klicken Sie im Menü Ansicht auf die Option Eigenschaftenseiten.

  4. Stellen Sie im Dialogfeld Eigenschaftenseiten sicher, dass im Dropdown-Listenfeld Konfiguration die Option Debug ausgewählt ist.

  5. Wählen Sie in der Ordneransicht auf der linken Seite den Ordner C/C++ aus.

  6. Wählen Sie im Ordner C++ die Option Optimization aus.

  7. Suchen Sie die Option Optimization in der Eigenschaftenliste auf der rechten Seite. Die Einstellung links davon lautet wahrscheinlich Disabled (/Od). Wählen Sie eine der anderen Optionen (Minimum Size(/O1), Maximum Speed(/O2), Full Optimization(/Ox) oder Custom) aus.

  8. Wenn Sie für die Optimization die Option Custom auswählen, können Sie Optionen für alle weiteren Eigenschaften in der Eigenschaftenliste festlegen.

Ermitteln Sie beim Debuggen von optimiertem Code im Fenster Disassembly, welche Anweisungen tatsächlich generiert und ausgeführt werden. Beim Festlegen von Haltepunkten sollten Sie beachten, dass der Haltepunkt zusammen mit einer Anweisung verschoben werden kann. Beachten Sie z. B. folgenden Code:

for (x=0; x<10; x++)

Angenommen, Sie haben in dieser Zeile einen Haltepunkt festgelegt. Sie gehen möglicherweise davon aus, dass der Haltepunkt 10 Mal getroffen wird. Wenn der Code optimiert ist, wird er jedoch nur einmal getroffen. Dies liegt daran, dass die erste Anweisung den Wert von x auf 0 festlegt. Der Compiler erkennt, dass dies nur einmal durchgeführt werden muss und verschiebt es aus der Schleife. Gleichzeitig wird auch der Haltepunkt verschoben. Die Anweisungen zum Vergleichen und Heraufsetzen von x verbleiben innerhalb der Schleife. Wenn Sie das Fenster Disassembly anzeigen, wird die Schritteinheit zur besseren Steuerung automatisch auf "Befehl" festgelegt. Dies ist bei der schrittweisen Ausführung von optimiertem Code von Vorteil.

Siehe auch

Konzepte

Debuggersicherheit

Weitere Ressourcen

Debuggen von systemeigenem Code