Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Om du försöker felsöka kod är det enklare när koden INTE är optimerad. När koden är optimerad gör kompilatorn och körningen ändringar i den genererade CPU-koden så att den körs snabbare, men har en mindre direkt mappning till den ursprungliga källkoden. Om mappningen är mindre direkt kan felsökare ofta inte berätta värdet för lokala variabler, och kodsteg och brytpunkter kanske inte fungerar som förväntat.
Anmärkning
Mer information om JIT-felsökning (just-in-time) finns i den här dokumentationen.
Så här fungerar optimeringar i .NET
Normalt skapar versionskonfigurationen optimerad kod och konfigurationen för felsökningsversionen gör det inte. Egenskapen Optimize MSBuild styr om kompilatorn uppmanas att optimera kod.
I .NET-ekosystemet omvandlas koden från källa till CPU-instruktioner i en tvåstegsprocess: först konverterar C#-kompilatorn texten du skriver till ett mellanliggande binärt formulär som heter MSIL och skriver ut MSIL till .dll filer. Senare konverterar .NET Runtime denna MSIL till CPU-instruktioner. Båda stegen kan optimeras i viss utsträckning, men det andra steget som utförs av .NET Runtime utför de mer betydande optimeringarna.
Alternativet "Utelämna JIT-optimering vid modulbelastning (endast hanterad)"
Felsökningsprogrammet erbjuder ett alternativ som styr vad som händer när en DLL som kompilerats med optimeringar aktiverade laddas i målprocessen. Om det här alternativet är avmarkerat (standardtillståndet) blir optimeringarna aktiverade när .NET Runtime kompilerar MSIL-koden till CPU-kod. Om alternativet är markerat begär felsökningsprogrammet att optimeringar inaktiveras.
Om du vill hitta alternativet Ignorera JIT-optimering vid modulinläsning (endast hanterad) väljer du Verktygsalternativ> och väljer sedan sidan Allmänt under noden Felsökning.
När ska du kontrollera alternativet "Ignorera JIT-optimering"?
Kontrollera det här alternativet när du laddade ned DLL:er från en annan källa, till exempel ett nuget-paket, och du vill felsöka koden i den här DLL-filen. För att undertryckning ska fungera måste du också hitta symbolfilen (.pdb) för den här DLL-filen.
Om du bara är intresserad av att felsöka koden som du skapar lokalt är det bäst att låta det här alternativet vara avmarkerat, eftersom det i vissa fall kommer att göra felsökningen betydligt långsammare om du aktiverar det här alternativet. Det finns två orsaker till denna avmattning:
- Optimerad kod körs snabbare. Om du inaktiverar optimeringar för massor av kod kan prestandapåverkan adderas upp.
- Om du har Just My Code aktiverat försöker felsökaren inte ens läsa in symboler för DLL:er som är optimerade. Det kan ta lång tid att hitta symboler.
Begränsningar för alternativet "Ignorera JIT-optimering"
Det finns två situationer där det inte fungerar att aktivera det här alternativet:
I situationer där du kopplar felsökningsprogrammet till en process som redan körs har det här alternativet ingen effekt på moduler som redan lästes in när felsökningsprogrammet kopplades.
Det här alternativet har ingen effekt på DLL:er som har förkompilerats (eller ngen'ed) till inhemsk kod. Du kan dock inaktivera användningen av förkompilerad kod genom att starta processen med miljövariabeln "COMPlus_ReadyToRun" inställd på "0". Detta instruerar .NET Core-körningen att inaktivera användningen av förkompilerade avbildningar, vilket tvingar körningen att JIT kompilera ramverkskod.
Om du riktar in dig på .NET Framework lägger du till miljövariabeln "COMPlus_ZapDisable" och ställer in den på "1".
Ange "COMPlus_ReadyToRun": "0" genom att lägga till den i varje profil i filen Egenskaper\launchSettings.js:
{
"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"
}
}
}