Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird erläutert, welche Compileroptionen festgelegt werden sollen, damit Sie optimierten Code besser debuggen können.
Eine bessere Benutzererfahrung ist ab Visual Studio 2022, Version 17.14, verfügbar, mit der Sie optimierten Code debuggen können, als ob er nicht optimiert kompiliert wurde und gleichzeitig die Geschwindigkeit des optimierten Codes beibehalten. Weitere Informationen finden Sie unter dynamisches Debuggen (Vorschau)von C++.
Hinweis
Die angezeigten Dialogfelder und Menübefehle unterscheiden sich je nach aktiven Einstellungen oder Edition möglicherweise von den in der Hilfe beschriebenen Befehlen. Um Ihre Einstellungen zu ändern, wählen Sie Import- und Exporteinstellungen im Menü Extras aus. Weitere Informationen finden Sie unter Zurücksetzen aller Einstellungen.
Hinweis
Die Compileroption /Zo (Optimiertes Debugging verbessern) (eingeführt in Visual Studio Update 3) generiert umfassendere Debuginformationen für optimierten Code (Projekte, die nicht mit der /Od-Compileroption erstellt wurden. Siehe /O-Optionen (Optimieren von Code)). Dies umfasst verbesserte Unterstützung für das Debuggen lokaler Variablen und inlineierter Funktionen.
"Bearbeiten" und "Weiter" ist deaktiviert, wenn die /Zo-Compileroption verwendet wird.
Wenn der Compiler Code optimiert, werden Anweisungen neu positioniert und neu organisiert. Dies führt zu effizienter kompiliertem Code. Aufgrund dieser Neuanordnung kann der Debugger nicht immer den Quellcode identifizieren, der einer Reihe von Anweisungen entspricht.
Die Optimierung kann sich auf Folgendes auswirken:
Der Optimierer kann lokale Variablen entfernen oder an Speicherorte verschieben, die der Debugger nicht versteht.
Positionen innerhalb einer Funktion, die geändert werden, wenn der Optimierer Codeblöcke zusammenführt.
Funktionsnamen für Frames im Aufrufstapel, was möglicherweise falsch ist, wenn der Optimierer zwei Funktionen zusammenführt.
Die Frames, die im Aufrufstapel angezeigt werden, sind fast immer richtig, vorausgesetzt, Sie verfügen über Symbole für alle Frames. Die Frames im Aufrufstapel sind falsch, wenn Sie Stapelbeschädigungen haben, wenn Sie Funktionen in der Assemblysprache geschrieben haben oder wenn Betriebssystemframes ohne übereinstimmende Symbole im Aufrufstapel vorhanden sind.
Globale und statische Variablen werden immer richtig angezeigt. Dies trifft auch auf das Strukturlayout zu. Wenn Sie einen Zeiger auf eine Struktur haben und der Wert des Zeigers korrekt ist, zeigt jede Membervariable der Struktur den richtigen Wert an.
Aufgrund dieser Einschränkungen sollten Sie nach Möglichkeit eine nicht optimierte Version Ihres Programms debuggen. Die Optimierung ist standardmäßig in der Debugkonfiguration eines C++-Programms deaktiviert und in der Releasekonfiguration aktiviert.
Ein Fehler kann jedoch nur in einer optimierten Version eines Programms angezeigt werden. In diesem Fall müssen Sie den optimierten Code debuggen.
So aktivieren Sie die Optimierung in einer Debugbuildkonfiguration
Wenn Sie ein neues Projekt erstellen, wählen Sie das
Win32 Debug
Ziel aus. Verwenden Sie dasWin32 Debug
Ziel, bis Ihr Programm vollständig gedebuggt ist und Sie bereit sind, einWin32 Release
Ziel zu erstellen. Der Compiler optimiert dasWin32 Debug
Ziel nicht.Wählen Sie das Projekt im Projektmappen-Explorer aus.
Klicken Sie im Menü Ansicht auf die Option Eigenschaftenseiten.
Stellen Sie im Dialogfeld Eigenschaftenseiten sicher, dass
Debug
in der Dropdownliste Konfiguration ausgewählt ist.Wählen Sie in der Ordneransicht auf der linken Seite den Ordner "C/C++" aus.
Wählen Sie unter dem Ordner C++ die Option
Optimization
aus.Suchen Sie in der Eigenschaftenliste auf der rechten Seite nach
Optimization
. Die Einstellung daneben sagt wahrscheinlichDisabled (
/Od)
. Wählen Sie eine der anderen Optionen aus (Minimum Size``(
/O1)
,Maximum Speed``(
/O2)
,Full Optimization``(
/Ox)
oderCustom
).Wenn Sie für die
Custom
die OptionOptimization
auswählen, können Sie Optionen für alle weiteren Eigenschaften in der Eigenschaftenliste festlegen.Wählen Sie die Knoten "Konfigurationseigenschaften", "C/C++" und "Befehlszeile" auf der Seite der Projekteigenschaften aus, und fügen Sie
(
/Zo)
in das Textfeld Zusätzliche Optionen ein.Warnung
Durch das Hinzufügen
/Zo
wird "Bearbeiten" und "Weiter" deaktiviert.Wenn Sie optimierten Code debuggen, verwenden Sie das Fenster "Disassembly ", um zu sehen, welche Anweisungen erstellt und ausgeführt werden. Beim Festlegen von Haltepunkten sollten Sie beachten, dass der Haltepunkt zusammen mit einer Anweisung verschoben werden kann. Betrachten Sie z. B. den folgenden Code:
for (x=0; x<10; x++)
Angenommen, Sie legen an dieser Zeile einen Haltepunkt fest. Möglicherweise erwarten Sie, dass der Haltepunkt 10 Mal erreicht wird, aber wenn der Code optimiert ist, wird der Haltepunkt nur einmal getroffen. Der Grund dafür ist, dass die erste Anweisung den Wert von x
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 Disassemblierung anzeigen, wird die Schritteinheit zur besseren Steuerung automatisch auf „Befehl“ festgelegt. Dies ist bei der schrittweisen Ausführung von optimiertem Code von Vorteil.