loaderLock MDA

loaderLock Asystent zarządzanego debugowania (MDA) wykrywa próby wykonania kodu zarządzanego w wątku, który przechowuje blokadę modułu ładującego systemu operacyjnego Microsoft Windows. Każde takie wykonanie jest nielegalne, ponieważ może prowadzić do zakleszczenia i używania bibliotek DLL przed ich zainicjowaniem przez moduł ładujący systemu operacyjnego.

Objawy

Najczęstszą awarią podczas wykonywania kodu wewnątrz blokady modułu ładującego systemu operacyjnego jest to, że wątki zakleszczą się podczas próby wywołania innych funkcji Win32, które również wymagają blokady modułu ładującego. Przykłady takich funkcji to LoadLibrary, GetProcAddress, FreeLibraryi GetModuleHandle. Aplikacja może nie wywoływać bezpośrednio tych funkcji; środowisko uruchomieniowe języka wspólnego (CLR) może wywoływać te funkcje w wyniku wywołania wyższego poziomu, takiego jak Load lub pierwsze wywołanie metody wywołania platformy.

Zakleszczenia mogą również wystąpić, jeśli wątek czeka na rozpoczęcie lub zakończenie innego wątku. Po uruchomieniu lub zakończeniu wykonywania wątku musi on uzyskać blokadę modułu ładującego systemu operacyjnego w celu dostarczania zdarzeń do dotkniętych bibliotek DLL.

Na koniec istnieją przypadki, w których wywołania do bibliotek DLL mogą wystąpić, zanim te biblioteki DLL zostały prawidłowo zainicjowane przez moduł ładujący systemu operacyjnego. W przeciwieństwie do niepowodzeń zakleszczenia, które można zdiagnozować, badając stosy wszystkich wątków zaangażowanych w zakleszczenie, bardzo trudno jest zdiagnozować użycie niezainicjowanych bibliotek DLL bez korzystania z tego mdA.

Przyczyna

Mieszane zarządzane/niezarządzane zestawy języka C++ utworzone dla .NET Framework wersji 1.0 lub 1.1 zwykle próbują wykonać kod zarządzany wewnątrz blokady modułu ładującego, chyba że została podjęta specjalna ostrożność, na przykład łączenie z /NOENTRY.

Mieszane zarządzane/niezarządzane zestawy języka C++ utworzone dla .NET Framework w wersji 2.0 są mniej podatne na te problemy, co aplikacje korzystające z niezarządzanych bibliotek DLL, które naruszają reguły systemu operacyjnego. Jeśli na przykład niezarządzany punkt wejścia biblioteki DLL DllMain wywoła wywołania CoCreateInstance w celu uzyskania obiektu zarządzanego, który został uwidoczniony w modelu COM, wynikiem jest próba wykonania kodu zarządzanego wewnątrz blokady modułu ładującego. Aby uzyskać więcej informacji na temat problemów z blokadą modułu ładującego w .NET Framework w wersji 2.0 lub nowszej, zobacz Inicjowanie zestawów mieszanych.

Rozwiązanie

W programach Visual C++ .NET 2002 i Visual C++ .NET 2003 biblioteki DLL skompilowane z /clr opcją kompilatora mogą nie determinicznie zakleszczać podczas ładowania; ten problem został wywołany problemem z mieszanym ładowaniem bibliotek DLL lub blokadą modułu ładującego. W programie Visual C++ 2005 i nowszych prawie wszystkie nie determinizmy zostały usunięte z mieszanego procesu ładowania bibliotek DLL. Istnieje jednak kilka pozostałych scenariuszy, dla których może wystąpić blokada modułu ładującego (deterministyczne). Aby uzyskać szczegółowe informacje o przyczynach i rozwiązaniach pozostałych problemów z blokadą modułu ładującego, zobacz Inicjowanie zestawów mieszanych. Jeśli ten temat nie identyfikuje problemu z blokadą modułu ładującego, należy zbadać stos wątku, aby określić, dlaczego występuje blokada modułu ładującego i jak rozwiązać problem. Przyjrzyj się śladowi stosu dla wątku, który aktywował tę usługę MDA. Wątek próbuje nielegalnie wywołać kod zarządzany podczas przechowywania blokady modułu ładującego systemu operacyjnego. Prawdopodobnie na stosie zostanie wyświetlony punkt wejścia biblioteki DLL DllMain lub równoważny. Reguły systemu operacyjnego dotyczące tego, co można legalnie zrobić z wewnątrz takiego punktu wejścia, są dość ograniczone. Te reguły uniemożliwiają wykonywanie zarządzane.

Wpływ na środowisko uruchomieniowe

Zazwyczaj kilka wątków wewnątrz procesu zakleszcza. Jeden z tych wątków może być wątkiem odpowiedzialnym za wykonywanie odzyskiwania pamięci, więc ten zakleszczenie może mieć duży wpływ na cały proces. Ponadto uniemożliwi to wykonywanie dodatkowych operacji wymagających blokady modułu ładującego systemu operacyjnego, takich jak ładowanie i zwalnianie zestawów lub bibliotek DLL oraz uruchamianie lub zatrzymywanie wątków.

W niektórych nietypowych przypadkach istnieje również możliwość wyzwolenia naruszeń dostępu lub podobnych problemów w bibliotekach DLL, które są wywoływane przed ich zainicjowaniem.

Dane wyjściowe

To rozwiązanie MDA zgłasza, że jest podejmowana próba nielegalnego wykonania zarządzanego. Należy zbadać stos wątku, aby określić, dlaczego występuje blokada modułu ładującego i jak rozwiązać problem.

Konfigurowanie

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

Zobacz też