Aracılığıyla paylaş


JIT İyileştirme ve Hata Ayıklama

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ı için yayılan CPU kodunda değişiklikler yapar, ancak özgün kaynak koduyla daha az doğrudan eşlemesi olur. 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.

Uyarı

JIT (Just-In-Time) hata ayıklaması hakkında daha fazla bilgi için bkz. Visual Studio'da Just-In-Time Debugger kullanarak hata ayıklama.

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

Normalde 'Release' derleme yapılandırması optimize edilmiş kod oluşturur ve 'Debug' derleme yapılandırması optimize edilmiş kod 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şlem içinde yüklendiğinde ne olacağını kontrol eden 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 Araçlar>Seçenekleri bölmesindeki Tüm Ayarlar>Genel>Hata Ayıklama bölümünde yapılandırabilirsiniz:

Modül yükü hata ayıklamada JIT İyileştirmesini Gizle seçeneğinin ekran görüntüsü.

Araçlar> iletişim kutusundaki Genel> bölümündeki Modül yükünde JIT iyileştirmesini gizle (Yalnızca yönetilen) seçeneğini yapılandırabilirsiniz:

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, bazı durumlarda bu seçeneği etkinleştirmek hata ayıklamayı önemli ölçüde yavaşlatma gibi, bu seçeneği işaretsiz bırakmak en iyisidir. Yavaşlamanı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 birikebilir.
  • 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 etkinleştirmenin çalışmadığı iki senaryo vardır:

  • Hata ayıklayıcıyı zaten çalışan bir işleme eklerseniz, bu seçeneğin hata ayıklayıcı eklendiğinde zaten yüklenmiş olan modüller üzerinde hiçbir etkisi olmaz.
  • Bu seçeneğin, önceden yerel koda derlenmiş (veya ngen edilen) DLL'ler üzerinde hiçbir etkisi yoktur. Ancak, işlemi 'COMPlus_ReadyToRun' ortam değişkenini '0' olarak ayarlayarak önceden derlenmiş kodun kullanımını devre dışı bırakabilirsiniz. Bu yaklaşım .NET Core çalışma zamanına önceden derlenmiş görüntülerin kullanımını devre dışı bırakmasını bildirir ve bu da çalışma zamanını JIT derleme çerçevesi koduna zorlar.

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

"COMPlus_ReadyToRun": "0" ayarlamak için her özelliği Özellikler\launchSettings.js dosyasındaki her profile ekleyin.

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