Freigeben über


Vereinfachen des Debuggens eines Bilds in .NET

Hinweis

Dieser Artikel ist spezifisch für .NET Framework. Sie gilt nicht für neuere Implementierungen von .NET, einschließlich .NET 6 und höherer Versionen.

Beim Kompilieren von nicht verwalteten Code können Sie ein ausführbares Image für das Debuggen konfigurieren, indem Sie IDE-Schalter oder Befehlszeilenoptionen festlegen. Sie können z. B. die Befehlszeilenoption "/Zi " in Visual C++ verwenden, um sie aufzufordern, Debugsymboldateien (Dateierweiterung PDB) auszugeben. Entsprechend weist die Befehlszeilenoption "/Od " dem Compiler an, die Optimierung zu deaktivieren. Der resultierende Code wird langsamer ausgeführt, aber es ist einfacher zu debuggen, sollte dies erforderlich sein.

Beim Kompilieren von verwaltetem .NET Framework-Code kompilieren Compiler wie Visual C++, Visual Basic und C# ihr Quellprogramm in eine gemeinsame Zwischensprache (CIL). CIL wird dann kurz vor der Ausführung mittels JIT-Kompilierung in nativen Maschinencode umgewandelt. Wie bei nicht verwalteten Code können Sie ein ausführbares Image für das Debuggen konfigurieren, indem Sie IDE-Schalter oder Befehlszeilenoptionen festlegen. Sie können auch die JIT-Kompilierung für das Debuggen auf die gleiche Weise konfigurieren.

Diese JIT-Konfiguration hat zwei Aspekte:

  • Sie können den JIT-Compiler anfordern, um Tracking-Informationen zu generieren. Dies ermöglicht es dem Debugger, eine Kette von CIL mit seinem Computercode-Gegenstück abzugleichen und nachzuverfolgen, wo lokale Variablen und Funktionsargumente gespeichert werden. In .NET Framework, Version 2.0 und höher, generiert der JIT-Compiler immer Tracking-Informationen, daher ist es nicht erforderlich, sie anzufordern.

  • Sie können den JIT-Compiler anfordern, um den resultierenden Computercode nicht zu optimieren.

Normalerweise legt der Compiler, der die CIL generiert, diese JIT-Compileroptionen entsprechend fest, basierend auf den IDE-Schaltern oder Befehlszeilenoptionen, die Sie angeben, z. B. "/Od".

In einigen Fällen möchten Sie möglicherweise das Verhalten des JIT-Compilers ändern, damit der generierte Maschinencode einfacher zu debuggen ist. Sie könnten beispielsweise JIT-Tracking-Informationen für ein Einzelhandelssystem oder eine Optimierung der Steuerung generieren. Dazu können Sie eine Initialisierungsdatei (.ini) verwenden.

Wenn beispielsweise die Assembly, die Sie debuggen möchten, MyApp.exeaufgerufen wird, können Sie eine Textdatei mit dem Namen MyApp.inierstellen, in demselben Ordner wie MyApp.exe, der diese drei Zeilen enthält:

[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0

Sie können den Wert jeder Option auf "0" oder "1" festlegen, und jede nicht vorhandene Option ist standardmäßig auf "0" gesetzt. Die Einstellung GenerateTrackingInfo auf 1 und AllowOptimize 0 bietet das einfachste Debugging.

Ab .NET Framework 2.0 generiert der JIT-Compiler immer Nachverfolgungsinformationen, unabhängig vom Wert für GenerateTrackingInfo; der AllowOptimize Wert hat jedoch weiterhin Auswirkungen. Wenn Sie den Ngen.exe (Native Image Generator) verwenden, um das systemeigene Image ohne Optimierung vorzukompilieren, muss die .ini Datei im Zielordner vorhanden sein, wenn AllowOptimize=0 Ngen.exe ausgeführt wird. Wenn Sie eine Assembly ohne Optimierung vorkompiliert haben, müssen Sie den vorkompilierten Code mithilfe NGen.exe /uninstall-Option entfernen, bevor Sie Ngen.exe erneut ausführen, um den Code als optimiert vorkompilieren. Wenn die .ini Datei nicht im Ordner vorhanden ist, wird der Code standardmäßig von Ngen.exe als optimiert vorkompiliert.

System.Diagnostics.DebuggableAttribute kontrolliert die Einstellungen für eine Assembly. DebuggableAttribute enthält zwei Felder, die steuern, ob der JIT-Compiler Tracking-Informationen optimieren und/oder generieren soll. In .NET Framework 2.0 und höheren Versionen generiert der JIT-Compiler immer Tracking-Informationen.

Für einen Einzelhandels-Build legen Compiler kein DebuggableAttribute fest. Standardmäßig generiert der JIT-Compiler die höchste Leistung, am schwierigsten zum Debuggen von Computercode. Durch das Aktivieren der JIT-Nachverfolgung wird die Leistung etwas verringert, und das Deaktivieren der Optimierung verringert die Leistung erheblich.

Das DebuggableAttribute gilt gleichzeitig für eine gesamte Assembly, nicht für einzelne Module innerhalb der Assembly. Entwicklungstools müssen daher benutzerdefinierte Attribute an das Assemblymetadatentoken anfügen, wenn bereits eine Assembly erstellt wurde, oder an die Klasse "System.Runtime.CompilerServices.AssemblyAttributesGoHere". Das ALink-Tool gibt diese DebuggableAttribute-Attribute aus den einzelnen Modulen dann an die Assembly weiter, deren Bestandteil sie werden. Wenn ein Konflikt auftritt, schlägt der ALink-Vorgang fehl.

Hinweis

In Version 1.0 von .NET Framework fügt der Microsoft Visual C++-Compiler das DebuggableAttribute hinzu, wenn die /clr - und /Zi-Compileroptionen angegeben werden. In Version 1.1 von .NET Framework müssen Sie entweder das DebuggableAttribute manuell in Ihrem Code hinzufügen oder die Linker-Option /ASSEMBLYDEBUG verwenden.

Siehe auch