Freigeben über


Gewusst wie: Debuggen von optimiertem Code

Aktualisiert: November 2007

Dieses Thema gilt für folgende Anwendungsbereiche:

Edition

Visual Basic

C#

C++

Web Developer

Express

Nur "Systemeigen"

Standard

Nur "Systemeigen"

Pro und Team

Nur "Systemeigen"

Tabellenlegende:

Vorhanden

Nicht vorhanden

Befehl oder Befehle, die standardmäßig ausgeblendet sind.

Hinweis:

Je nach den aktiven Einstellungen oder der verwendeten Version können sich die angezeigten Dialogfelder und Menübefehle von den in der Hilfe beschriebenen unterscheiden. Klicken Sie im Menü Extras auf Einstellungen importieren und exportieren, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Visual Studio-Einstellungen.

Bei der Codeoptimierung durch den Compiler werden Anweisungen neu positioniert und organisiert, wodurch der kompilierte Code effizienter wird. 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 richtig, 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.

Manchmal ist ein Fehler 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.

Finden Sie beim Debuggen von optimiertem Code im Fenster Disassembly heraus, welche Anweisungen tatsächlich generiert und ausgeführt werden. Beim Festlegen von Haltepunkten sollten Sie darauf achten, 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 können davon ausgehen, dass der Haltepunkt 10 Mal getroffen wird. Wenn der Code optimiert ist, wird er jedoch nur einmal getroffen. Dies liegt daran, dass der Wert von x durch die erste Anweisung auf 0 festgelegt wird. Der Compiler erkennt, dass diese Stelle nur einmal berücksichtigt werden muss und entfernt sie 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