Delen via


JIT-optimalisatie en foutopsporing

Als u fouten in code probeert op te sporen, is het eenvoudiger wanneer die code NIET is geoptimaliseerd. Wanneer code is geoptimaliseerd, brengen de compiler en runtime wijzigingen aan in de gegenereerde CPU-code, zodat deze sneller wordt uitgevoerd, maar heeft een minder directe toewijzing aan de oorspronkelijke broncode. Als de toewijzing minder direct is, kunnen foutopsporingsprogramma's u vaak niet de waarde van lokale variabelen vertellen en werken codestap- en onderbrekingspunten mogelijk niet zoals verwacht.

Hoe optimalisaties werken in .NET

Normaal gesproken maakt de Release-buildconfiguratie geoptimaliseerde code, terwijl de Debug-buildconfiguratie dat niet doet. De Optimize eigenschap MSBuild bepaalt of de compiler wordt verteld code te optimaliseren.

In het .NET-ecosysteem wordt code omgezet van bron- naar CPU-instructies in een proces in twee stappen: eerst converteert de C#-compiler de tekst die u typt naar een tussenliggend binair formulier met de naam MSIL en schrijft de MSIL naar .dll bestanden. Later converteert de .NET Runtime deze MSIL naar CPU-instructies. Beide stappen kunnen in zekere mate worden geoptimaliseerd, maar de tweede stap die door de .NET Runtime wordt uitgevoerd, voert de belangrijkste optimalisaties uit.

De optie JIT-optimalisatie onderdrukken bij modulebelasting (alleen beheerd)

Het foutopsporingsprogramma maakt een optie beschikbaar waarmee wordt beheerd wat er gebeurt wanneer een DLL die is gecompileerd met optimalisaties, laadt binnen het doelproces. Als deze optie is uitgeschakeld (de standaardstatus), laat de optimalisaties ingeschakeld wanneer de .NET Runtime de MSIL-code compileert in CPU-code. Als de optie is ingeschakeld, vraagt het foutopsporingsprogramma om optimalisaties uit te schakelen.

U kunt de optie JIT-optimalisatie onderdrukken bij het laden van modules (alleen beheerd) configureren in het deelvensterExtra-opties> in de sectieAlgemene>foutopsporing>:

Schermopname van de optie om JIT-optimalisatie te onderdrukken bij modulebelasting voor foutopsporing.

U kunt de optie JIT-optimalisatie onderdrukken bij het laden van modules (alleen beheerd) configureren in het dialoogvensterExtra-opties> in de sectie Algemene>foutopsporing:

JIT-optimalisatie onderdrukken

Wanneer moet u de optie 'JIT-optimalisatie onderdrukken' aanvinken?

Schakel deze optie in wanneer u de DLL's hebt gedownload uit een andere bron, zoals een NuGet-pakket, en u fouten wilt opsporen in de code in dit DLL-bestand. Opdat de onderdrukking werkt, moet u ook het symboolbestand (.pdb) van deze DLL vinden.

Als u alleen geïnteresseerd bent in het opsporen van fouten in de code die u lokaal bouwt, kunt u deze optie het beste uitgeschakeld laten, omdat in sommige gevallen het inschakelen van deze optie aanzienlijk de foutopsporing vertraagt. Er zijn twee redenen voor de vertraging:

  • Geoptimaliseerde code wordt sneller uitgevoerd. Als u optimalisaties voor veel code uitschakelt, kan de prestatie-impact zich opstapelen.
  • Als Just My Code is ingeschakeld, probeert het foutopsporingsprogramma niet eens symbolen te laden voor DLL's die zijn geoptimaliseerd. Het zoeken naar symbolen kan lang duren.

Beperkingen van de optie JIT-optimalisatie onderdrukken

Er zijn twee scenario's waarbij het inschakelen van deze optie NIET werkt:

  • Als u het foutopsporingsprogramma koppelt aan een al uitgevoerd proces, heeft deze optie geen invloed op modules die al zijn geladen op het moment dat het foutopsporingsprogramma is gekoppeld.
  • Deze optie heeft geen effect op DLL's die vooraf zijn gecompileerd (of ngen'ed) naar systeemeigen code. U kunt het gebruik van vooraf gecompileerde code echter uitschakelen door het proces te starten met de omgevingsvariabele 'COMPlus_ReadyToRun' ingesteld op '0'. Deze benadering vertelt de .NET Core-runtime om het gebruik van vooraf gecompileerde afbeeldingen uit te schakelen, waardoor de runtime gedwongen wordt JIT frameworkcode te compileren.

    Als u zich richt op .NET Framework, voegt u de omgevingsvariabele 'COMPlus_ZapDisable' toe en stelt u deze in op '1'.

Stel "COMPlus_ReadyToRun": "0" in door het toe te voegen aan elk profiel in het Eigenschappen\launchSettings.jsop bestand.

{
  "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"
    }
  }
}