JIT İyileştirmesi ve Hata Ayıklaması

Kodda hata ayıklamaya çalışıyorsanız, bu kod en iyi duruma getirilmediğinde daha kolay olur. Kod iyileştirildiğinde, derleyici ve çalışma zamanı, daha hızlı çalışması, ancak özgün kaynak koduyla daha az doğrudan eşlemesi olması için yayılan CPU kodunda değişiklikler yapar. Eşleme daha az doğrudansa, hata ayıklayıcılar genellikle yerel değişkenlerin değerini size söyleyemez ve kod adımlama ve kesme noktaları beklediğiniz gibi çalışmayabilir.

Not

JIT (Tam Zamanında) hata ayıklama hakkında daha fazla bilgi için bu belgeleri okuyun.

.NET'te iyileştirmeler nasıl çalışır?

Normalde Yayın derleme yapılandırması iyileştirilmiş kod oluşturur ve Hata ayıklama derleme yapılandırması oluşturmaz. Optimize MSBuild özelliği, derleyiciye kodu iyileştirmesinin söylenip söylenmediğini denetler.

.NET ekosisteminde kod, iki adımlı bir işlemde kaynaktan CPU yönergelerine dönüştürülür: İlk olarak, C# derleyicisi yazdığınız metni MSIL adlı bir ara ikili forma dönüştürür ve MSIL'i .dll dosyalarına yazar. Daha sonra .NET Çalışma Zamanı bu MSIL'i CPU yönergelerine dönüştürür. Her iki adım da bir dereceye kadar iyileştirilebilir, ancak .NET Çalışma Zamanı tarafından gerçekleştirilen ikinci adım daha önemli iyileştirmeleri gerçekleştirir.

'Modül yükünde JIT iyileştirmesini gizle (Yalnızca yönetilen)' seçeneği

Hata ayıklayıcı, iyileştirmeler etkinleştirilmiş bir DLL hedef işlemin içinde yüklendiğinde ne olacağını denetleye bir seçenek sunar. Bu seçeneğin işareti kaldırılırsa (varsayılan durum), .NET Çalışma Zamanı MSIL kodunu CPU kodunda derlediğinde iyileştirmeleri etkin bırakır. Seçenek işaretliyse, hata ayıklayıcısı iyileştirmelerin devre dışı bırakılma isteğinde bulunur.

Modül yükünde JIT iyileştirmesini gizle (Yalnızca yönetilen) seçeneğini bulmak için Araçlar>Seçenekleri'ni ve ardından Hata Ayıklama düğümü altındaki Genel sayfasını seçin.

JIT İyileştirmeyi Gizleme

'JIT iyileştirmesini bastır' seçeneğini ne zaman işaretlemeniz gerekir?

DLL'leri nuget paketi gibi başka bir kaynaktan indirdiğinizde ve bu DLL'deki kodun hatalarını ayıklamak istediğinizde bu seçeneği işaretleyin. Gizlemenin çalışması için, bu DLL'nin sembol (.pdb) dosyasını da bulmanız gerekir.

Yalnızca yerel olarak oluşturduğunuz kodun hatalarını ayıklamak ilginizi çekiyorsa, bu seçeneği işaretsiz bırakmak en iyisidir. Bazı durumlarda bu seçeneğin etkinleştirilmesi hata ayıklamayı önemli ölçüde yavaşlatır. Bu yavaşlanın iki nedeni vardır:

  • İyileştirilmiş kod daha hızlı çalışır. Çok sayıda kod için iyileştirmeleri kapatıyorsanız performans etkisi oluşabilir.
  • Yalnızca Kodum etkinleştirildiyse, hata ayıklayıcı iyileştirilmiş DLL'ler için sembolleri yüklemeyi bile denemez. Sembolleri bulmak uzun sürebilir.

'JIT iyileştirmesini gizle' seçeneğinin sınırlamaları

Bu seçeneği açmanın çalışmadığı iki durum vardır:

  1. Hata ayıklayıcısını zaten çalışan bir işleme eklediğiniz durumlarda, bu seçeneğin hata ayıklayıcı eklendiği sırada zaten yüklenmiş olan modüller üzerinde hiçbir etkisi olmaz.

  2. Bu seçeneğin yerel koda önceden derlenmiş (veya ngen'ed) DLL'ler üzerinde hiçbir etkisi yoktur. Ancak işlemi 'COMPlus_ReadyToRun' ortam değişkeni '0' olarak ayarlayarak önceden derlenmiş kodun kullanımını devre dışı bırakabilirsiniz. Bu, .NET Core çalışma zamanına önceden derlenmiş görüntülerin kullanımını devre dışı bırakmasını ve çalışma zamanını JIT derleme çerçevesi koduna zorlamasını söyler.

    .NET Framework'leri hedef alıyorsanız, 'COMPlus_ZapDisable' ortam değişkenini ekleyin ve '1' olarak ayarlayın.

Özellikler\launch Ayarlar.json dosyasındaki her profile ekleyerek ayarlayın"COMPlus_ReadyToRun": "0":

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