Göra en bild enklare att felsöka i .NET

När du kompilerar ohanterad kod kan du konfigurera en körbar avbildning för felsökning genom att ange IDE-växlar eller kommandoradsalternativ. Du kan till exempel använda kommandoradsalternativet /Zi i Visual C++ för att be den att generera felsökningssymbolfiler (filnamnstillägget .pdb). På samma sätt uppmanar kommandoradsalternativet /Od kompilatorn att inaktivera optimering. Den resulterande koden körs långsammare, men det är lättare att felsöka, om detta skulle vara nödvändigt.

Vid kompilering av .NET Framework-hanterad kod kompilerar kompilatorer som Visual C++, Visual Basic och C# sitt källprogram till det gemensamma mellanliggande språket (CIL). CIL är sedan JIT-kompilerad, precis före körning, till inbyggd datorkod. Precis som med ohanterad kod kan du konfigurera en körbar avbildning för felsökning genom att ange IDE-växlar eller kommandoradsalternativ. Du kan också konfigurera JIT-kompilering för felsökning på ungefär samma sätt.

Den här JIT-konfigurationen har två aspekter:

  • Du kan begära att JIT-kompilatorn genererar spårningsinformation. Detta gör det möjligt för felsökaren att matcha en kedja med CIL med dess datorkodmotsvarighet och spåra var lokala variabler och funktionsargument lagras. I .NET Framework version 2.0 och senare genererar JIT-kompilatorn alltid spårningsinformation, så det finns inget behov av att begära den.

  • Du kan begära att JIT-kompilatorn inte optimerar den resulterande datorkoden.

Normalt anger kompilatorn som genererar CIL dessa JIT-kompilatoralternativ på rätt sätt, baserat på de IDE-växlar eller kommandoradsalternativ som du anger, till exempel /Od.

I vissa fall kanske du vill ändra JIT-kompilatorns beteende så att den datorkod som genereras blir lättare att felsöka. Du kanske till exempel vill generera JIT-spårningsinformation för en detaljhandelsversion eller kontrolloptimering. Du kan göra det med en initieringsfil (.ini).

Om den sammansättning som du vill felsöka till exempel kallas MyApp.exe kan du skapa en textfil med namnet MyApp.ini, i samma mapp som MyApp.exe, som innehåller följande tre rader:

[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0

Du kan ange värdet för varje alternativ till 0 eller 1, och alla frånvarande alternativ är som standard 0. Inställningen GenerateTrackingInfo till 1 och AllowOptimize 0 ger den enklaste felsökningen.

Från och med .NET Framework 2.0 genererar JIT-kompilatorn alltid spårningsinformation oavsett värdet för GenerateTrackingInfo. Värdet har dock AllowOptimize fortfarande en effekt. När du använder Ngen.exe (inbyggd avbildningsgenerator) för att förkompilera den interna avbildningen utan optimering måste .ini-filen finnas i målmappen med AllowOptimize=0 när Ngen.exe körs. Om du har förkompilerat en sammansättning utan optimering måste du ta bort den förkompilerade koden med hjälp av alternativet NGen.exe /uninstall innan du kör Ngen.exe för att förkompilera koden som optimerad. Om den .ini filen inte finns i mappen, förkompileras koden som optimerad som standard Ngen.exe.

Styr System.Diagnostics.DebuggableAttribute inställningarna för en sammansättning. DebuggableAttribute innehåller två fält som styr om JIT-kompilatorn ska optimera och/eller generera spårningsinformation. I .NET Framework 2.0 och senare versioner genererar JIT-kompilatorn alltid spårningsinformation.

För en detaljhandelsversion ställer kompilatorerna inte in någon DebuggableAttribute. Som standard genererar JIT-kompilatorn högsta prestanda, vilket är svårast att felsöka maskinkod. Att aktivera JIT-spårning sänker prestandan lite, och om du inaktiverar optimeringen sänks prestandan mycket.

DebuggableAttribute gäller för en hel sammansättning i taget, inte för enskilda moduler i sammansättningen. Utvecklingsverktyg måste därför koppla anpassade attribut till sammansättningsmetadatatoken, om en sammansättning redan har skapats eller till klassen System.Runtime.CompilerServices.AssemblyAttributesGoHere. ALink-verktyget höjer sedan upp dessa DebuggableAttribute-attribut från varje modul till den sammansättning som de blir en del av. Om det finns en konflikt misslyckas ALink-åtgärden.

Kommentar

I version 1.0 av .NET Framework lägger Microsoft Visual C++-kompilatorn till DebuggableAttribute när kompileringsalternativen /clr och /Zi anges. I version 1.1 av .NET Framework måste du antingen lägga till DebuggableAttribute manuellt i koden eller använda länkalternativet /ASSEMBLYDEBUG .

Se även