Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Jeśli próbujesz debugować kod, łatwiej jest, gdy ten kod NIE jest zoptymalizowany. Gdy kod jest zoptymalizowany, kompilator i środowisko uruchomieniowe wprowadza zmiany w emitowanym kodzie procesora CPU, dzięki czemu działa szybciej, ale ma mniej bezpośrednie mapowanie na oryginalny kod źródłowy. Jeśli mapowanie jest mniej bezpośrednie, debugery często nie mogą podać wartości zmiennych lokalnych, a krokowanie po kodzie i punkty przerwania mogą nie działać zgodnie z oczekiwaniami.
Uwaga / Notatka
Aby uzyskać więcej informacji na temat debugowania JIT (Just-In-Time), zobacz Debugowanie przy użyciu debugera Just-In-Time w programie Visual Studio.
Jak działają optymalizacje na platformie .NET
Ogólnie konfiguracja Release tworzy zoptymalizowany kod, a konfiguracja Debug tego nie robi. Właściwość Optimize MSBuild określa, czy kompilator ma zoptymalizować kod.
W ekosystemie platformy .NET kod jest przekształcany z kodu źródłowego na instrukcje CPU w procesie dwuetapowym: najpierw kompilator języka C# konwertuje tekst, który wpisujesz, na pośrednią formę binarną, zwaną MSIL, i zapisuje MSIL do plików .dll. Później środowisko uruchomieniowe platformy .NET konwertuje ten zestaw MSIL na instrukcje dotyczące procesora CPU. Oba kroki można zoptymalizować w pewnym stopniu, ale drugi krok wykonywany przez środowisko uruchomieniowe platformy .NET wykonuje bardziej znaczące optymalizacje.
Opcja "Pomiń optymalizację JIT przy obciążeniu modułu (tylko zarządzana)"
Debuger uwidacznia opcję, która kontroluje, co się stanie, gdy biblioteka DLL skompilowana z włączonymi optymalizacjami jest ładowana wewnątrz procesu docelowego. Jeśli ta opcja nie jest zaznaczona (stan domyślny), to gdy środowisko uruchomieniowe platformy .NET kompiluje kod MSIL do kodu procesora CPU, pozostawia włączone optymalizacje. Jeśli opcja jest zaznaczona, debuger żąda wyłączenia optymalizacji.
Możesz skonfigurować opcję Pomijanie optymalizacji JIT przy obciążeniu modułu (tylko zarządzane) w okienku Opcje narzędzi> w sekcji Wszystkie ustawienia>>:
W oknie dialogowym Narzędzia> w sekcji Ogólne>, można skonfigurować opcję Pomiń optymalizację JIT przy załadowaniu modułu (tylko zarządzane):
Kiedy należy sprawdzić opcję "Pomiń optymalizację JIT"?
Zaznacz tę opcję po pobraniu bibliotek DLL z innego źródła, takiego jak pakiet NuGet, i chcesz debugować kod w tej bibliotece DLL. Aby tłumienie działało, należy również znaleźć plik symboli (.pdb) dla tej biblioteki DLL.
Jeśli interesuje Cię tylko debugowanie kodu, który tworzysz lokalnie, najlepiej pozostawić tę opcję niezaznaczoną, ponieważ w niektórych przypadkach włączenie tej opcji znacznie spowalnia debugowanie. Istnieją dwa powody spowolnienia:
- Zoptymalizowany kod działa szybciej. Jeśli wyłączysz optymalizacje dla wielu kodów, wpływ na wydajność może się zwiększyć.
- Jeśli masz włączoną opcję Just My Code, debuger nawet nie próbuje załadować symboli dla bibliotek DLL, które są zoptymalizowane. Znajdowanie symboli może zająć dużo czasu.
Ograniczenia opcji "Pomijanie optymalizacji JIT"
Istnieją dwa scenariusze, w których włączenie tej opcji nie działa:
- Jeśli dołączysz debuger do już uruchomionego procesu, ta opcja nie ma wpływu na moduły już załadowane w momencie dołączenia debugera.
Ta opcja nie ma wpływu na wstępnie skompilowane biblioteki DLL (lub ngen'ed) do kodu natywnego. Można jednak wyłączyć użycie wstępnie skompilowanego kodu, uruchamiając proces ze zmienną środowiskową "COMPlus_ReadyToRun" ustawioną na wartość "0". Takie podejście nakazuje środowisku uruchomieniowemu platformy .NET Core wyłączyć użycie wstępnie skompilowanych obrazów, co wymusza na środowisku uruchomieniowym skompilowanie kodu platformy za pomocą JIT.
Jeśli używasz platformy .NET Framework, dodaj zmienną środowiskową "COMPlus_ZapDisable" i ustaw ją na "1".
Ustaw "COMPlus_ReadyToRun": "0" poprzez dodanie go do każdego profilu w Właściwościach\launchSettings.jspliku:
{
"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"
}
}
}