Erleichtern das Debuggen in .NET ein AbbildMaking an image easier to debug in .NET

Beim Kompilieren von nicht verwaltetem Code können Sie durch das Festlegen von IDE-Schaltern oder Befehlszeilenoptionen ein ausführbares Image zum Debuggen konfigurieren.When compiling unmanaged code, you can configure an executable image for debugging by setting IDE switches or command-line options. Sie können beispielsweise die Befehlszeilenoption /Zi in Visual C++ verwenden, um zur Ausgabe von Debugsymboldateien aufzufordern (Dateierweiterung „.pdb“).For example, you can use the /Zi command-line option in Visual C++ to ask it to emit debug symbol files (file extension .pdb). Dementsprechend weist die Befehlszeilenoption /Od den Compiler an, die Optimierung zu deaktivieren.Similarly, the /Od command-line option tells the compiler to disable optimization. Der resultierende Code wird langsamer ausgeführt, aber es ist einfacher zu debuggen, dies erforderlich sein sollte.The resulting code runs more slowly, but it's easier to debug, should this be necessary.

Beim Kompilieren der .NET Framework Code verwalteten kompilieren Compiler wie Visual C++, Visual Basic und C#-ihr Quellprogramm in Microsoft intermediate Language (MSIL) an.When compiling .NET Framework managed code, compilers such as Visual C++, Visual Basic, and C# compile their source program into Microsoft intermediate language (MSIL). MSIL erfolgt die JIT-kompiliert, unmittelbar vor der Ausführung in systemeigenen Computercode.MSIL is then JIT-compiled, just before execution, into native machine code. Ähnlich wie bei nicht verwaltetem Code können Sie durch das Festlegen von IDE-Schaltern oder Befehlszeilenoptionen ein ausführbares Image zum Debuggen konfigurieren.As with unmanaged code, you can configure an executable image for debugging by setting IDE switches or command-line options. Sie können auch die JIT-Kompilierung zum Debuggen in die gleiche Weise konfigurieren.You can also configure the JIT compilation for debugging in much the same way.

Diese JIT-Konfiguration hat zwei Aspekte:This JIT configuration has two aspects:

  • Sie können den JIT-Compiler zum Generieren von Nachverfolgungsinformationen anfordern.You can request the JIT compiler to generate tracking information. Dadurch kann der Debugger eine Kette von MSIL dem entsprechenden Computercode zuordnen und verfolgen, wo lokale Variablen und Funktionsargumente gespeichert werden.This makes it possible for the debugger to match up a chain of MSIL with its machine code counterpart, and to track where local variables and function arguments are stored. Ab .NET Framework, Version 2.0, generiert der JIT-Compiler immer Überwachungsinformationen, daher keine Notwendigkeit besteht, die Anforderung.Starting with the .NET Framework version 2.0, the JIT compiler always generates tracking information, so there is no need to request it.

  • Sie können anfordern, dass den JIT-Compiler, um den erzeugten Computercode nicht zu optimieren.You can request the JIT compiler to not optimize the resulting machine code.

Normalerweise legt der Compiler, der die MSIL generiert, diese JIT-Compileroptionen entsprechend basierend auf den IDE-Schaltern oder Befehlszeilenoptionen, die Sie, z. B. angeben /Od.Normally, the compiler that generates the MSIL sets these JIT compiler options appropriately, based upon the IDE switches or command-line options you specify, for example, /Od.

Mitunter kann es erforderlich sein, das Verhalten des JIT-Compilers zu ändern, sodass der generierte Computercode einfacher zu debuggen ist.In some cases, you might want to change the behavior of the JIT compiler so that the machine code it generates is easier to debug. So können Sie z. B. JIT-Verfolgungsinformationen für eine Verkaufsversion generieren oder die Optimierung steuern.For example, you might want to generate JIT tracking information for a retail build or control optimization. Dazu können Sie eine Initialisierungsdatei (INI) verwenden.You can do so with an initialization (.ini) file.

Z. B. wenn die Assembly, die Sie debuggen möchten spricht MyApp.exe, anschließend können Sie eine Textdatei namens erstellen MyApp.ini, im gleichen Ordner wie MyApp.exe, enthält Diese drei Zeilen:For example, if the assembly you want to debug is called MyApp.exe, then you can create a text file named MyApp.ini, in the same folder as MyApp.exe, which contains these three lines:

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

Sie können für die Optionen jeweils den Wert 0 oder 1 einstellen. Nicht vorhandene Optionen haben standardmäßig den Wert 0.You can set the value of each option to 0 or 1, and any absent option defaults to 0. Am einfachsten lässt sich die Assembly debuggen, wenn Sie für GenerateTrackingInfo 1 und für AllowOptimize 0 festlegen.Setting GenerateTrackingInfo to 1 and AllowOptimize to 0 provides the easiest debugging.

Ab .NET Framework, Version 2.0, generiert der JIT-Compiler immer Verfolgungsinformationen unabhängig vom Wert für GenerateTrackingInfo, aber die AllowOptimize Wert immer noch wirkt sich ein.Starting with the .NET Framework version 2.0, the JIT compiler always generates tracking information regardless of the value for GenerateTrackingInfo; however, the AllowOptimize value still has an effect. Wenn Sie das native Image mithilfe von Ngen.exe (Native Image Generator) ohne Optimierung vorkompilieren, muss bei der Ausführung von „Ngen.exe“ die INI-Datei im Zielordner mit der Einstellung AllowOptimize=0 vorhanden sein.When using the Ngen.exe (Native Image Generator) to precompile the native image without optimization, the .ini file must be present in the target folder with AllowOptimize=0 when Ngen.exe executes. Wenn Sie eine Assembly ohne Optimierung vorkompiliert haben, müssen Sie den vorkompilierten Code mit NGen.exe entfernen / uninstall Option vor der Ngen.exe erneut ausführen, um den Code in optimierter Form vorzukompilieren.If you have precompiled an assembly without optimization, you must remove the precompiled code using NGen.exe /uninstall option before rerunning Ngen.exe to precompile the code as optimized. Wenn die INI-Datei nicht im Ordner vorhanden ist, führt die Vorkompilierung standardmäßig Ngen.exe des Codes wie optimiert.If the .ini file isn't present in the folder, by default Ngen.exe precompiles the code as optimized.

System.Diagnostics.DebuggableAttribute kontrolliert die Einstellungen für eine Assembly.The System.Diagnostics.DebuggableAttribute controls the settings for an assembly. DebuggableAttribute enthält zwei Felder, die steuern, ob der JIT-Compiler eine Optimierung und/oder Verfolgungsinformationen generieren soll.DebuggableAttribute includes two fields that control whether the JIT compiler should optimize and/or generate tracking information. Ab .NET Framework, Version 2.0, generiert der JIT-Compiler immer Verfolgungsinformationen.Starting with the .NET Framework version 2.0, the JIT compiler always generates tracking information.

Für eine Verkaufsversion Compiler nicht legen DebuggableAttribute.For a retail build, compilers don't set any DebuggableAttribute. Standardmäßig generiert der JIT-Compiler die höchste Leistung, die am schwersten zu debuggen.By default, the JIT compiler generates the highest performance, hardest to debug machine code. Durch Aktivieren der JIT-Verfolgung wird die Leistung geringfügig, durch Deaktivieren der Optimierung erheblich verschlechtert.Enabling JIT tracking lowers performance a little, and disabling optimization lowers performance a lot.

DebuggableAttribute gilt immer für die gesamte Assembly, nicht für einzelne Module innerhalb der Assembly.The DebuggableAttribute applies to a whole assembly at a time, not to individual modules within the assembly. Aus diesem Grund müssen Entwicklungstools benutzerdefinierte Attribute an das Metadatentoken der Assembly anfügen, sofern bereits eine Assembly erstellt wurde oder aber an die System.Runtime.CompilerServices.AssemblyAttributesGoHere-Klasse.Development tools must therefore attach custom attributes to the assembly metadata token, if an assembly has already been created, or to the class called System.Runtime.CompilerServices.AssemblyAttributesGoHere. Das ALink-Tool stuft dann diese DebuggableAttribute -Attribute von den einzelnen Modulen an die Assembly werden sie Teil.The ALink tool then promotes these DebuggableAttribute attributes from each module to the assembly they become a part of. Wenn ein Konflikt vorliegt, schlägt der ALink-Vorgang fehl.If there's a conflict, the ALink operation fails.

Hinweis

In Version 1.0 von .NET Framework fügt der Microsoft Visual C++-Compiler das DebuggableAttribute hinzu, wenn die Compileroptionen /clr und /Zi angegeben werden.In version 1.0 of the .NET Framework, the Microsoft Visual C++ compiler adds the DebuggableAttribute when the /clr and /Zi compiler options are specified. In Version 1.1 von .NET Framework müssen Sie entweder das DebugabbleAttribute manuell im Code hinzufügen oder die Linkeroption /ASSEMBLYDEBUG verwenden.In version 1.1 of the .NET Framework, you must either add the DebugabbleAttribute manually in your code or use the /ASSEMBLYDEBUG linker option.

Siehe auchSee also