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.
Wenn Sie versuchen, Code zu debuggen, ist es einfacher, wenn dieser Code NICHT optimiert ist. Wenn Code optimiert ist, nehmen der Compiler und die Laufzeit Änderungen am ausgegebenen CPU-Code vor, sodass er schneller ausgeführt wird, aber eine weniger direkte Zuordnung zum ursprünglichen Quellcode hat. Wenn die Zuordnung weniger direkt ist, können Debugger häufig den Wert lokaler Variablen nicht erkennen, und Codeschritte und Haltepunkte funktionieren möglicherweise nicht wie erwartet.
Hinweis
Weitere Informationen zum JIT-Debugging (Just-In-Time) finden Sie unter "Debuggen mithilfe des Just-In-Time Debuggers in Visual Studio".
Funktionsweise von Optimierungen in .NET
Normalerweise erstellt die Releasebuildkonfiguration optimierten Code und die Debugbuildkonfiguration nicht. Die Optimize MSBuild-Eigenschaft steuert, ob der Compiler angewiesen wird, Code zu optimieren.
Im .NET-Ökosystem wird Code aus der Quelle in CPU-Anweisungen in einem zweistufigen Prozess umgewandelt: Zuerst konvertiert der C#-Compiler den Text, den Sie eingeben, in eine binäre Zwischenform namens MSIL und schreibt die MSIL in .dll Dateien. Später konvertiert die .NET-Runtime diese MSIL in CPU-Anweisungen. Beide Schritte können bis zu einem gewissen Grad optimiert werden, aber der zweite Schritt, der von der .NET-Runtime ausgeführt wird, führt die signifikanteren Optimierungen durch.
Die Option "Unterdrücken von JIT-Optimierungen beim Laden von Modulen (nur verwaltet)"
Der Debugger macht eine Option verfügbar, die steuert, was passiert, wenn eine DLL mit aktivierten Optimierungen geladen wird, innerhalb des Zielprozesses. Wenn diese Option deaktiviert ist (Standardstatus), bleibt die Optimierung aktiviert, wenn die .NET-Runtime den MSIL-Code in CPU-Code kompiliert. Wenn die Option aktiviert ist, fordert der Debugger an, dass Optimierungen deaktiviert werden.
Sie können die Option "JIT-Optimierung unterdrücken" beim Laden des Moduls (nur verwaltet) im Bereich "Extras>Optionen " im Abschnitt "Alle Einstellungen>: Allgemeines>Debuggen " konfigurieren:
Sie können die Option "JIT-Optimierung unterdrücken" beim Laden des Moduls (nur verwaltet) im Dialogfeld ">" im Abschnitt "Allgemeines>Debuggen" konfigurieren:
Wann sollten Sie die Option "JIT-Optimierung unterdrücken" überprüfen?
Aktivieren Sie diese Option, wenn Sie die DLLs aus einer anderen Quelle heruntergeladen haben, z. B. ein NuGet-Paket, und sie möchten den Code in dieser DLL debuggen. Damit die Unterdrückung funktioniert, müssen Sie auch die Symboldatei (PDB) für diese DLL finden.
Wenn Sie nur an dem Debuggen des Codes interessiert sind, den Sie lokal erstellen, ist es am besten, diese Option deaktiviert zu lassen, da die Aktivierung dieser Option in einigen Fällen das Debuggen erheblich verlangsamt. Es gibt zwei Gründe für die Verlangsamung:
- Optimierter Code wird schneller ausgeführt. Wenn Sie Optimierungen für viele Codezeilen abschalten, können sich die Auswirkungen auf die Leistung häufen.
- Wenn "Nur Mein Code" aktiviert ist, versucht der Debugger nicht einmal, Symbole für DLLs zu laden, die optimiert sind. Das Suchen von Symbolen kann eine lange Zeit dauern.
Einschränkungen der Option "JIT-Optimierung unterdrücken"
Es gibt zwei Szenarien, in denen die Aktivierung dieser Option NICHT funktioniert:
- Wenn Sie den Debugger an einen bereits ausgeführten Prozess anfügen, hat diese Option keine Auswirkungen auf Module, die zum Zeitpunkt der Anfügung des Debuggers bereits geladen wurden.
Diese Option hat keine Auswirkungen auf DLLs, die zu nativem Code vorkompiliert (oder ngen'ed) wurden. Sie können die Verwendung von vorkompiliertem Code jedoch deaktivieren, indem Sie den Prozess mit der Umgebungsvariable "COMPlus_ReadyToRun" starten, die auf "0" festgelegt ist. Dieser Ansatz weist die .NET Core-Runtime an, die Verwendung vorkompilierter Images zu deaktivieren, was die Runtime zwingt, Framework-Code JIT zu kompilieren.
Wenn Sie auf .NET Framework abzielen, fügen Sie die Umgebungsvariable "COMPlus_ZapDisable" hinzu , und legen Sie sie auf "1" fest.
Legen Sie "COMPlus_ReadyToRun": "0" fest, indem Sie es jedem Profil in den Eigenschaften\launchSettings.jsauf der Datei hinzufügen:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:59694/",
"sslPort": 44320
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"COMPlus_ReadyToRun": "0"
}
},
"HttpLoggingSample": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"COMPlus_ReadyToRun": "0"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}