JIT-optimalizálás és hibakeresés

A kód hibakeresése egyszerűbb, ha a kód NINCS optimalizálva. Ha a kód optimalizálva van, a fordító és a futtatókörnyezet módosítja a kibocsátott CPU-kódot, hogy gyorsabban fusson, de kevésbé közvetlen leképezéssel rendelkezik az eredeti forráskódhoz. Ha a leképezés kevésbé közvetlen, a hibakeresők gyakran nem tudják megmondani a helyi változók értékét, és előfordulhat, hogy a kódlépések és töréspontok nem a várt módon működnek.

Megjegyzés:

A JIT (Just-In-Time) hibakeresésével kapcsolatos további információkért lásd : Hibakeresés a Just-In-Time Hibakereső használatával a Visual Studióban.

Az optimalizálás működése a .NET-ben

A kiadás buildkonfigurációja általában optimalizált kódot hoz létre, és a hibakeresési buildkonfiguráció nem. Az Optimize MSBuild tulajdonság szabályozza, hogy a fordítónak a kód optimalizálására van-e utasítva.

A .NET-ökoszisztémában a kód forrásról processzorutasításra vált egy kétlépéses folyamat során: először a C# fordítója konvertálja a beírt szöveget egy MSIL nevű köztes bináris űrlapra, és az MSIL-t .dll fájlokká alakítja. Később a .NET-futtatókörnyezet ezt az MSIL-t cpu-utasításokká alakítja. Mindkét lépés bizonyos mértékben optimalizálható, de a .NET-futtatókörnyezet második lépése a jelentősebb optimalizálásokat hajtja végre.

A "JIT-optimalizálás letiltása modulbetöltés esetén (csak felügyelt)" lehetőség

A hibakereső egy olyan lehetőséget tesz elérhetővé, amely szabályozza, hogy mi történik, ha egy optimalizálással lefordított DLL betöltődik a célfolyamaton belül. Ha ez a beállítás nincs bejelölve (az alapértelmezett állapot), akkor amikor a .NET-futtatókörnyezet lefordítja az MSIL-kódot a CPU-kódba, az optimalizálás engedélyezve marad. Ha a beállítás be van jelölve, akkor a hibakereső azt kéri, hogy tiltsa le az optimalizálásokat.

A JIT-optimalizálás letiltása modulbetöltéskor (csak felügyelt) az Eszközök>beállításaipanelEn, az Összes beállítás>általános>hibakeresési szakaszában konfigurálható:

Képernyőkép a JIT-optimalizálás letiltásának lehetőségéről modulbetöltéskor hibakeresés során.

A JIT-optimalizálás letiltása modulbetöltéskor (csak felügyelt) az Eszközök>beállításai párbeszédpanel általános>hibakeresési szakaszában konfigurálható:

JIT-optimalizálás letiltása

Mikor érdemes ellenőrizni a "JIT-optimalizálás mellőzése" lehetőséget?

Akkor jelölje be ezt a lehetőséget, ha a DLL-eket egy másik forrásból, például egy NuGet-csomagból töltötte le, és hibakeresést szeretne végezni ebben a DLL-ben. Ahhoz, hogy a letiltás működjön, meg kell keresnie a DLL szimbólumfájlját (.pdb).

Ha csak a helyileg létrehozott kód hibakeresése érdekli, érdemes bejelöletlenül hagyni ezt a beállítást, mivel bizonyos esetekben a beállítás engedélyezése jelentősen lassítja a hibakeresést. A lassulásnak két oka van:

  • Az optimalizált kód gyorsabban fut. Ha sok kód esetében kikapcsolja az optimalizálást, a teljesítményre gyakorolt hatás összeadódhat és jelentősé válhat.
  • Ha engedélyezve van a Just My Code, a hibakereső még az optimalizált DLL-ek szimbólumait sem próbálja betölteni. A szimbólumok keresése hosszú időt vehet igénybe.

A JIT-optimalizálás mellőzése lehetőség korlátozásai

A beállítás engedélyezésének két forgatókönyve nem működik:

  • Ha a hibakeresőt egy már futó folyamathoz csatolja, ez a beállítás nincs hatással a hibakereső csatlakoztatásakor már betöltött modulokra.
  • Ez a beállítás nincs hatással a natív kódra előre lefordított (vagy ngen'ed) DLL-ekre. Az előre összeállított kód használatát azonban letilthatja úgy, hogy elindítja a folyamatot a "COMPlus_ReadyToRun" környezeti változó 0 értékre állításával. Ez a megközelítés arra utasítja a .NET Core-futtatókörnyezetet, hogy tiltsa le az előre összeállított rendszerképek használatát, ami kényszeríti a futtatókörnyezetet a JIT fordítási keretrendszer kódjára.

    Ha a .NET-keretrendszert célozza, adja hozzá a "COMPlus_ZapDisable" környezeti változót, és állítsa az "1" értékre.

Állítsa be "COMPlus_ReadyToRun": "0", hozzáadva a Properties\launchSettings.json fájlban minden profilhoz:

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