loaderLock MDA
Not
Bu makale .NET Framework'e özgüdür. .NET 6 ve sonraki sürümleri de dahil olmak üzere daha yeni .NET uygulamaları için geçerli değildir.
Yönetilen loaderLock
hata ayıklama yardımcısı (MDA), Yönetilen kodu Microsoft Windows işletim sistemi yükleyici kilidini tutan bir iş parçacığında yürütme girişimlerini algılar. Bu tür yürütmeler, kilitlenmelere ve dll'lerin işletim sisteminin yükleyicisi tarafından başlatılmadan önce kullanılmasına neden olabileceğinden geçersizdir.
Belirtiler
İşletim sisteminin yükleyici kilidinin içinde kod yürütülürken en yaygın hata, iş parçacıklarının, yükleyici kilidini de gerektiren diğer Win32 işlevlerini çağırmaya çalışırken kilitlenmesidir. Bu tür işlevlere örnek olarak LoadLibrary
, GetProcAddress
, FreeLibrary
ve GetModuleHandle
verilebilir. Uygulama bu işlevleri doğrudan çağırmayabilir; ortak dil çalışma zamanı (CLR), platform çağırma yöntemine yapılan ilk çağrı gibi Load daha üst düzey bir çağrının sonucu olarak bu işlevleri çağırabilir.
Bir iş parçacığı başka bir iş parçacığının başlamasını veya bitip bitmediğini bekliyorsa kilitlenmeler de oluşabilir. Bir iş parçacığı yürütülmeye başladığında veya tamamlandığında, etkilenen DLL'lere olay teslim etmek için işletim sisteminin yükleyici kilidini alması gerekir.
Son olarak, DLL'lere yapılan çağrıların işletim sisteminin yükleyicisi tarafından düzgün bir şekilde başlatılmadan önce gerçekleşebileceği durumlar vardır. Kilitlenmeye dahil olan tüm iş parçacıklarının yığınları incelenerek tanılanabilen kilitlenme hatalarından farklı olarak, bu MDA'yı kullanmadan başlatılmamış DLL'lerin kullanımını tanılamak çok zordur.
Neden
.NET Framework 1.0 veya 1.1 sürümleri için oluşturulan karma yönetilen/yönetilmeyen C++ derlemeleri genellikle özel bir özen göstermediği sürece (örneğin, /NOENTRY ile bağlantı oluşturma) yönetilen kodu yükleyici kilidi içinde yürütmeye çalışır.
.NET Framework sürüm 2.0 için oluşturulan karma yönetilen/yönetilmeyen C++ derlemeleri bu sorunlardan daha az etkilenir ve işletim sisteminin kurallarını ihlal eden yönetilmeyen DLL'leri kullanan uygulamalarla aynı risk azalır. Örneğin, yönetilmeyen bir DLL'nin DllMain
giriş noktası COM'a sunulan yönetilen bir nesneyi almak için çağırırsa CoCreateInstance
, sonuç yükleyici kilidinin içinde yönetilen kodu yürütme girişimidir. .NET Framework sürüm 2.0 ve sonraki sürümlerindeki yükleyici kilidi sorunları hakkında daha fazla bilgi için bkz . Karma Derlemeleri Başlatma.
Çözüm
Visual C++ .NET 2002 ve Visual C++ .NET 2003'te, derleyici seçeneğiyle /clr
derlenen DLL'ler yüklendiğinde belirlenimsiz olarak kilitlenmeye neden olabilir; bu soruna karma DLL yükleme veya yükleyici kilidi sorunu adı verilirdi. Visual C++ 2005 ve sonraki sürümlerde, neredeyse tüm determinizm dışı öğeler karma DLL yükleme işleminden kaldırılmıştır. Ancak, yükleyici kilidinin (belirlenimci) gerçekleşebileceği birkaç senaryo daha vardır. Kalan yükleyici kilidi sorunlarının nedenlerinin ve çözümlerinin ayrıntılı bir hesabı için bkz . Karma Derlemeleri Başlatma. Bu konu yükleyici kilidi sorununuzu tanımlamıyorsa, yükleyici kilidinin neden oluştuğunu ve sorunun nasıl düzeltileceğini belirlemek için iş parçacığı yığınını incelemeniz gerekir. Bu MDA'yi etkinleştiren iş parçacığının yığın izlemesine bakın. İş parçacığı, işletim sisteminin yükleyici kilidini tutarken yönetilen kodu yasadışı olarak çağırmaya çalışıyor. Büyük olasılıkla yığında dll'nin DllMain
veya eşdeğer bir giriş noktasını görürsünüz. Bu tür bir giriş noktasından yasal olarak yapabileceklerinize ilişkin işletim sisteminin kuralları oldukça sınırlıdır. Bu kurallar tüm yönetilen yürütmeleri engeller.
Çalışma Zamanı üzerindeki etkisi
Genellikle, işlemin içindeki birkaç iş parçacığı kilitlenmeye neden olur. Bu iş parçacıklarından birinin çöp toplama işleminden sorumlu bir iş parçacığı olması muhtemeldir, bu nedenle bu kilitlenme sürecin tamamında önemli bir etkiye sahip olabilir. Ayrıca, derlemeleri veya DLL'leri yükleme ve kaldırma ve iş parçacıklarını başlatma veya durdurma gibi işletim sisteminin yükleyici kilidini gerektiren ek işlemleri engeller.
Bazı olağan dışı durumlarda, erişim ihlallerinin veya benzer sorunların başlatılmadan önce çağrılan DLL'lerde tetiklenebilmesi de mümkündür.
Çıktı
Bu MDA, geçersiz yönetilen yürütme girişiminde bulunulduğunu bildirir. Yükleyici kilidinin neden oluştuğunu ve sorunun nasıl düzeltileceğini belirlemek için iş parçacığı yığınını incelemeniz gerekir.
Yapılandırma
<mdaConfig>
<assistants>
<loaderLock/>
</assistants>
</mdaConfig>