Uwaga
Dostęp do tej strony wymaga autoryzacji. Może 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 to robić, gdy ten kod nie jest NIE 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), przeczytaj tę dokumentację.
Jak działają optymalizacje na platformie .NET
Zwykle kompilacja Release tworzy zoptymalizowany kod, a kompilacja Debug nie tworzy. 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.
Aby znaleźć opcję Pomiń optymalizację JIT podczas ładowania modułu (tylko zarządzane), wybierz Narzędzia>Opcje, a następnie wybierz stronę Ogólne pod węzłem Debugowanie.
Kiedy należy sprawdzić opcję "Pomiń optymalizację JIT"?
Zaznacz tę opcję, gdy pobrałeś biblioteki 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 tworzonego lokalnie, najlepiej pozostawić tę opcję niezaznaczoną, ponieważ w niektórych przypadkach włączenie tej opcji znacznie spowolni debugowanie. Istnieją dwie przyczyny tego spowolnienia:
- Zoptymalizowany kod działa szybciej. Jeśli wyłączasz optymalizacje dla wielu kodu, wpływ na wydajność może się zwiększać.
- Jeśli masz włączony tylko mój kod, debuger nawet nie spró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ą dwie sytuacje, w których włączenie tej opcji NIE będzie działać:
W sytuacjach, gdy dołączasz debuger do już uruchomionego procesu, ta opcja nie będzie miała wpływu na moduły, które zostały już załadowane w momencie dołączenia debugera.
Ta opcja nie ma wpływu na biblioteki DLL, które zostały wstępnie skompilowane (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". Spowoduje to, że środowisko uruchomieniowe platformy .NET Core wyłączy użycie wstępnie skompilowanych obrazów, zmuszając środowisko uruchomieniowe do kompilowania kodu platformy JIT.
Jeśli używasz programu .NET Framework, dodaj zmienną środowiskową "COMPlus_ZapDisable" i ustaw ją na wartość "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"
}
}
}