Bagikan melalui


loaderLock MDA

Catatan

Artikel ini khusus untuk .NET Framework. Ini tidak berlaku untuk implementasi .NET yang lebih baru, termasuk .NET 6 dan versi yang lebih baru.

Asisten penelusuran kesalahan terkelola (MDA) loaderLock mendeteksi upaya untuk mengeksekusi kode terkelola pada utas yang menyimpan kunci pemuat sistem operasi Microsoft Windows. Eksekusi semacam itu ilegal karena dapat menyebabkan kebuntuan dan penggunaan DLL sebelum diinisialisasi oleh pemuat sistem operasi.

Gejala

Kegagalan paling umum saat mengeksekusi kode di dalam kunci pemuat sistem operasi adalah bahwa utas akan menemui jalan buntu ketika mencoba memanggil fungsi Win32 lain yang juga memerlukan kunci pemuat. Contoh fungsi tersebut adalah LoadLibrary, GetProcAddress, FreeLibrary, dan GetModuleHandle. Aplikasi mungkin tidak secara langsung memanggil fungsi-fungsi ini; runtime bahasa umum (CLR) mungkin memanggil fungsi-fungsi ini sebagai hasil dari panggilan tingkat yang lebih tinggi seperti Load atau panggilan pertama ke metode pemanggilan platform.

Kebuntuan juga dapat terjadi jika sebuah utas sedang menunggu utas lain untuk memulai atau menyelesaikannya. Saat utas mulai atau selesai dieksekusi, utas harus memperoleh kunci pemuat sistem operasi untuk mengirimkan peristiwa ke DLL yang terpengaruh.

Terakhir, ada kasus ketika panggilan ke DLL dapat terjadi sebelum DLL tersebut diinisialisasi dengan benar oleh pemuat sistem operasi. Tidak seperti kegagalan kebuntuan, yang dapat didiagnosis dengan memeriksa tumpukan semua utas yang terlibat dalam kebuntuan, sangat sulit untuk mendiagnosis penggunaan DLL yang tidak diinisialisasi tanpa menggunakan MDA ini.

Penyebab

Rakitan C++ terkelola/tidak terkelola campuran yang dibuat untuk .NET Framework versi 1.0 atau 1.1 umumnya mencoba mengeksekusi kode terkelola di dalam kunci pemuat kecuali ada perhatian khusus, misalnya, menautkan dengan /NOENTRY.

Rakitan C++ terkelola/tidak terkelola campuran yang dibuat untuk .NET Framework versi 2.0 kurang rentan terhadap masalah ini, memiliki risiko yang sama dengan aplikasi yang menggunakan DLL tidak terkelola yang melanggar aturan sistem operasi. Misalnya, jika titik masuk DllMain DLL yang tidak terkelola memanggil CoCreateInstance untuk mendapatkan objek terkelola yang telah diekspos ke COM, hasilnya adalah upaya untuk mengeksekusi kode terkelola di dalam kunci pemuat. Untuk informasi selengkapnya tentang masalah kunci pemuat di .NET Framework versi 2.0 dan yang lebih baru, baca Inisialisasi Rakitan Campuran.

Resolusi

Dalam Visual C++ .NET 2002 dan Visual C++ .NET 2003, DLL yang dikompilasi dengan opsi kompiler /clr dapat menemui kebuntuan secara non-deterministik saat dimuat; masalah ini disebut masalah pemuatan DLL campuran atau kunci pemuat. Dalam Visual C++ 2005 dan yang lebih baru, hampir semua non-determinisme telah dihapus dari proses pemuatan DLL campuran. Namun, ada beberapa skenario yang tersisa ketika penguncian pemuat dapat (secara deterministik) terjadi. Untuk akun terperinci tentang penyebab dan penyelesaian masalah kunci pemuat yang tersisa, baca Inisialisasi Rakitan Campuran. Jika topik tersebut tidak mengidentifikasi masalah kunci pemuat Anda, Anda harus memeriksa tumpukan utas untuk menentukan alasan kunci pemuat terjadi dan cara memperbaiki masalah. Lihatlah jejak tumpukan untuk utas yang telah mengaktifkan MDA ini. Utas mencoba memanggil secara ilegal ke kode terkelola sambil menahan kunci pemuat sistem operasi. Anda mungkin akan melihat DllMain DLL atau titik masuk yang setara di tumpukan. Aturan sistem operasi untuk hal yang dapat Anda lakukan secara legal dari dalam titik masuk semacam itu sangat terbatas. Aturan ini menghalangi eksekusi terkelola.

Efek pada Runtime

Biasanya, beberapa utas di dalam proses akan menemui kebuntuan. Salah satu utas tersebut kemungkinan merupakan utas yang bertanggung jawab untuk melakukan pengumpulan sampah, sehingga kebuntuan ini dapat berdampak besar pada keseluruhan proses. Selain itu, upaya ini akan mencegah operasi tambahan apa pun yang memerlukan kunci pemuat sistem operasi, seperti rakitan bongkar muat atau DLL dan memulai atau menghentikan utas.

Dalam beberapa kasus yang tidak biasa, pelanggaran akses atau masalah serupa dapat dipicu di DLL yang dipanggil sebelum diinisialisasi.

Output

MDA ini melaporkan bahwa eksekusi terkelola ilegal sedang dicoba. Anda perlu memeriksa tumpukan utas untuk menentukan alasan penguncian pemuat terjadi dan cara memperbaiki masalah.

Konfigurasi

<mdaConfig>
  <assistants>
    <loaderLock/>
  </assistants>
</mdaConfig>

Lihat juga