Erleichtern des Debuggens für ein AbbildMaking an Image Easier to Debug

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 erzeugte Code wird langsamer ausgeführt, lässt sich jedoch gegebenenfalls einfacher debuggen.The resulting code runs more slowly, but is easier to debug, should this be necessary.

Beim Kompilieren von verwaltetem Code in .NET Framework kompilieren Compiler (z. B. Visual C++, Visual Basic und C#) ihr Quellprogramm in Microsoft Intermediate Language (MSIL).When compiling .NET Framework managed code, compilers such as Visual C++, Visual Basic, and C# compile their source program into Microsoft Intermediate Language (MSIL). Anschließend wird MSIL unmittelbar vor der Ausführung mit JIT in systemeigenen Computercode kompiliert.MSIL is subsequently 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 Abbild zum Debuggen konfigurieren.As with unmanaged code, you can configure an executable image for debugging by setting IDE switches or command-line options. Darüber hinaus können Sie die JIT-Kompilierung zum Debuggen im Großen und Ganzen genauso konfigurieren.In addition, you can 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 anweisen, Verfolgungsinformationen zu generieren.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. In .NET Framework, Version 2.0, generiert der JIT-Compiler stets Verfolgungsinformationen, d. h., Sie müssen diese nicht anfordern.In the .NET Framework version 2.0, the JIT compiler will always generate tracking information, so there is no need to request it.

  • Sie können den JIT-Compiler anweisen, 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 fest. Sie basieren auf den angegebenen IDE-Schaltern oder Befehlszeilenoptionen, die Sie angeben (z.B. /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.

Beispiel: Wenn die zu debuggende Assembly MyApp.exe heißt, erstellen Sie in dem Ordner, in dem MyApp.exe gespeichert ist, eine Textdatei mit dem Namen MyApp.ini, die die folgenden drei Zeilen enthält: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.

Hinweis

In .NET Framework Version 2.0 generiert der JIT-Compiler unabhängig vom Wert für GenerateTrackingInfo immer Verfolgungsinformationen. Der AllowOptimize-Wert hat jedoch weiterhin Auswirkungen.In 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. Falls Sie eine Assembly ohne Optimierung vorkompiliert haben, müssen Sie den vorkompilierten Code mit der /uninstall-Option von „Ngen.exe“ entfernen, bevor Sie „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 the NGen.exe /uninstall option before rerunning Ngen.exe to precompile the code as optimized. Wenn die INI-Datei nicht im Ordner vorhanden ist, kompiliert Ngen.exe den Code standardmäßig optimiert vor.If the .ini file is not present in the folder, by default Ngen.exe precompiles the code as optimized.

Hinweis

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, in denen festgelegt wird, ob der JIT-Compiler eine Optimierung durchführen und/oder Verfolgungsinformationen generieren soll.DebuggableAttribute includes two fields that record the settings for whether the JIT compiler should optimize, and/or generate tracking information. In .NET Framework, Version 2.0, generiert der JIT-Compiler immer Verfolgungsinformationen.In the .NET Framework version 2.0, the JIT compiler will always generate tracking information.

Hinweis

Bei Verkaufsversionen legen Compiler das Attribut DebuggableAttribute nicht fest.For a retail build, compilers do not set any DebuggableAttribute. Der JIT-Compiler generiert standardmäßig Computercode, der eine optimale Leistungsfähigkeit bietet und höchst schwierig zu debuggen ist.The JIT-compiler default behavior is to generate 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.

Hinweis

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 gibt diese DebuggableAttribute-Attribute von den einzelnen Modulen an die Assembly weiter, deren Bestandteil sie werden.The ALink tool will then promote these DebuggableAttribute attributes from each module to the assembly they become a part of. Wenn hierbei ein Konflikt auftritt, schlägt der ALink-Vorgang fehl.If there is a conflict, the ALink operation will fail.

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

Debuggen, Ablaufverfolgung und ProfilerstellungDebugging, Tracing, and Profiling
Aktivieren von JIT-attach DebuggingEnabling JIT-Attach Debugging
Aktivieren der ProfilerstellungEnabling Profiling