Share via


Een afbeelding eenvoudiger fouten opsporen in .NET

Notitie

Dit artikel is specifiek voor .NET Framework. Dit geldt niet voor nieuwere implementaties van .NET, waaronder .NET 6 en nieuwere versies.

Bij het compileren van niet-beheerde code kunt u een uitvoerbare installatiekopie configureren voor foutopsporing door IDE-switches of opdrachtregelopties in te stellen. U kunt bijvoorbeeld de opdrachtregeloptie /Zi in Visual C++ gebruiken om het te vragen om foutopsporingssymboolbestanden (bestandsextensie .pdb) te verzenden. Op dezelfde manier geeft de opdrachtregeloptie /Od aan dat de compiler optimalisatie moet uitschakelen. De resulterende code wordt langzamer uitgevoerd, maar het is eenvoudiger om fouten op te sporen, mocht dit nodig zijn.

Bij het compileren van beheerde .NET Framework-code compileert u compilers zoals Visual C++, Visual Basic en C# hun bronprogramma in een gemeenschappelijke tussentaal (CIL). CIL wordt vervolgens JIT gecompileerd, vlak voordat deze wordt uitgevoerd, in systeemeigen computercode. Net als bij niet-beheerde code kunt u een uitvoerbare installatiekopie configureren voor foutopsporing door IDE-switches of opdrachtregelopties in te stellen. U kunt de JIT-compilatie ook op dezelfde manier configureren voor foutopsporing.

Deze JIT-configuratie heeft twee aspecten:

  • U kunt de JIT-compiler aanvragen om traceringsgegevens te genereren. Hierdoor kan het foutopsporingsprogramma overeenkomen met een keten van CIL met zijn tegenhanger voor computercode en bijhouden waar lokale variabelen en functieargumenten worden opgeslagen. In .NET Framework versie 2.0 en hoger genereert de JIT-compiler altijd traceringsgegevens, dus u hoeft deze niet aan te vragen.

  • U kunt de JIT-compiler aanvragen om de resulterende machinecode niet te optimaliseren.

Normaal gesproken stelt de compiler die het CIL genereert deze JIT-compileropties op de juiste manier in op basis van de IDE-switches of opdrachtregelopties die u opgeeft, bijvoorbeeld /Od.

In sommige gevallen wilt u mogelijk het gedrag van de JIT-compiler wijzigen, zodat de computercode die wordt gegenereerd gemakkelijker kan worden opgespoord. U kunt bijvoorbeeld JIT-traceringsgegevens genereren voor een retailbuild of controleoptimalisatie. U kunt dit doen met een initialisatiebestand (.ini).

Als de assembly die u wilt opsporen bijvoorbeeld MyApp.exe wordt genoemd, kunt u een tekstbestand met de naam MyApp.ini maken, in dezelfde map als MyApp.exe, die deze drie regels bevat:

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

U kunt de waarde van elke optie instellen op 0 of 1 en eventuele afwezige opties worden standaard ingesteld op 0. Instelling GenerateTrackingInfo op 1 en AllowOptimize 0 biedt de eenvoudigste foutopsporing.

Vanaf .NET Framework 2.0 genereert de JIT-compiler altijd traceringsgegevens, ongeacht de waarde voor GenerateTrackingInfo; de AllowOptimize waarde heeft echter nog steeds een effect. Wanneer u de Ngen.exe (Native Image Generator) gebruikt om de systeemeigen installatiekopie vooraf te compileren zonder optimalisatie, moet het .ini bestand aanwezig zijn in de doelmap met AllowOptimize=0 wanneer Ngen.exe wordt uitgevoerd. Als u een assembly vooraf hebt gecompileerd zonder optimalisatie, moet u de vooraf gecompileerde code verwijderen met behulp van NGen.exe optie /uninstall voordat u Ngen.exe opnieuw uitvoert om de code vooraf te compileren als geoptimaliseerd. Als het bestand .ini niet aanwezig is in de map, Ngen.exe de code standaard vooraf compileren zoals geoptimaliseerd.

Hiermee System.Diagnostics.DebuggableAttribute bepaalt u de instellingen voor een assembly. DebuggableAttribute bevat twee velden die bepalen of de JIT-compiler traceringsgegevens moet optimaliseren en/of genereren. In .NET Framework 2.0 en latere versies genereert de JIT-compiler altijd traceringsgegevens.

Voor een retail-build stellen compilers geen DebuggableAttribute in. Standaard genereert de JIT-compiler de hoogste prestaties, die het moeilijkst zijn om fouten in computercode op te sporen. Het inschakelen van JIT-tracering verlaagt de prestaties een beetje en het uitschakelen van optimalisatie verlaagt veel prestaties.

De DebuggableAttribute is van toepassing op een hele assembly tegelijk, niet op afzonderlijke modules binnen de assembly. Ontwikkelhulpprogramma's moeten daarom aangepaste kenmerken koppelen aan het metagegevenstoken van de assembly, als er al een assembly is gemaakt of aan de klasse System.Runtime.CompilerServices.AssemblyAttributesGoHere. Het hulpprogramma ALink bevordert vervolgens deze DebuggableAttribute-kenmerken van elke module tot de assembly waarvan ze deel uitmaken. Als er een conflict is, mislukt de ALink-bewerking.

Notitie

In versie 1.0 van .NET Framework voegt de Microsoft Visual C++-compiler de DebuggableAttribute toe wanneer de opties /clr en /Zi-compiler zijn opgegeven. In versie 1.1 van .NET Framework moet u de DebuggableAttribute handmatig toevoegen aan uw code of de linkeroptie /ASSEMBLYDEBUG gebruiken.

Zie ook