Bagikan melalui


Pengoptimalan dan Penelusuran Kesalahan JIT

Jika Anda mencoba melakukan debug kode, lebih mudah jika kode tersebut TIDAK dioptimalkan. Ketika kode dioptimalkan, kompilator dan runtime membuat perubahan pada kode CPU yang dipancarkan sehingga berjalan lebih cepat, tetapi memiliki pemetaan yang kurang langsung ke kode sumber asli. Jika pemetaan kurang langsung, debugger sering kali tidak dapat memberi tahu Anda nilai variabel lokal, dan langkah kode dan titik henti mungkin tidak berfungsi seperti yang Anda harapkan.

Nota

Untuk informasi selengkapnya mengenai debugging JIT (Just-In-Time), lihat Debug menggunakan JIT Debugger di Visual Studio.

Cara kerja pengoptimalan di .NET

Biasanya konfigurasi build Rilis membuat kode yang dioptimalkan dan konfigurasi build Debug tidak. Properti Optimize MSBuild mengontrol apakah pengkompilasi disuruh mengoptimalkan kode.

Dalam ekosistem .NET, kode diubah dari sumber ke instruksi CPU dalam proses dua langkah: pertama, pengkompilasi C# mengonversi teks yang Anda ketik ke formulir biner perantara yang disebut MSIL dan menulis MSIL ke file .dll. Kemudian, .NET Runtime mengonversi MSIL ini ke instruksi CPU. Kedua langkah dapat dioptimalkan hingga beberapa derajat, tetapi langkah kedua yang dilakukan oleh Runtime .NET melakukan pengoptimalan yang lebih signifikan.

Opsi 'Menekan pengoptimalan JIT pada pemuatan modul (Hanya dikelola)'

Debugger menyediakan opsi yang mengontrol apa yang terjadi ketika DLL yang dikompilasi dengan pengoptimalan aktif dimuat di dalam proses target. Jika opsi ini tidak dicentang (status default), maka ketika Runtime .NET mengkompilasi kode MSIL ke dalam kode CPU, opsi tersebut membiarkan pengoptimalan diaktifkan. Jika opsi dicentang, maka debugger meminta pengoptimalan dinonaktifkan.

Anda dapat mengonfigurasi opsi Sembunyikan pengoptimalan JIT pada beban modul (Hanya terkelola) di panelOpsi>, di bagian Semua Pengaturan>Penelusuran Kesalahan>:

Tangkapan layar opsi Matikan Pengoptimalan JIT saat debugging muatan modul.

Anda dapat mengonfigurasi opsi Tekan pengoptimalan JIT pada beban modul (Hanya terkelola) dalam dialogOpsi>, di bagianPenelusuran Kesalahan>:

Menonaktifkan Pengoptimalan JIT

Kapan Anda harus memeriksa opsi 'Tekan pengoptimalan JIT'?

Centang opsi ini saat Anda mengunduh DLL dari sumber lain, seperti paket NuGet, dan Anda ingin men-debug kode di DLL ini. Agar penindasan berfungsi, Anda juga harus menemukan file simbol (.pdb) untuk DLL ini.

Jika Anda hanya tertarik untuk melakukan debug pada kode yang Anda buat secara lokal, sebaiknya biarkan opsi ini tidak dicentang, karena, dalam beberapa kasus, mengaktifkan opsi ini memperlambat proses debug secara signifikan. Ada dua alasan untuk perlambatan:

  • Kode yang dioptimalkan berjalan lebih cepat. Jika Anda menonaktifkan pengoptimalan untuk banyak kode, dampak performa dapat bertambah.
  • Jika Anda mengaktifkan Just My Code, debugger bahkan tidak mencoba memuat simbol untuk DLL yang dioptimalkan. Menemukan simbol dapat memakan waktu lama.

Batasan opsi 'Tekan pengoptimalan JIT'

Ada dua skenario di mana mengaktifkan opsi ini TIDAK berfungsi:

  • Jika Anda melampirkan debugger ke proses yang sudah berjalan, opsi ini tidak berpengaruh pada modul yang sudah dimuat pada saat debugger dilampirkan.
  • Opsi ini tidak berpengaruh pada DLL yang telah dikompilasi sebelumnya (atau ngen'ed) ke kode asli. Namun, Anda dapat menonaktifkan penggunaan kode yang telah dikompilasi sebelumnya dengan memulai proses dengan variabel lingkungan 'COMPlus_ReadyToRun' diatur ke '0'. Pendekatan ini memberi tahu runtime .NET Core untuk menonaktifkan penggunaan gambar yang sudah dikompilasi sebelumnya, yang memaksa runtime untuk mengkompilasi kode kerangka kerja dengan JIT.

    Jika Anda menargetkan .NET Framework, tambahkan variabel lingkungan 'COMPlus_ZapDisable' dan atur ke '1'.

Atur "COMPlus_ReadyToRun": "0" dengan menambahkannya ke setiap profil di properti\launchSettings.jspada file:

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