Sdílet prostřednictvím


loaderLock – pomocník spravovaného ladění (MDA)

Poznámka:

Tento článek je specifický pro rozhraní .NET Framework. Nevztahuje se na novější implementace .NET, včetně .NET 6 a novějších verzí.

Pomocník loaderLock spravovaného ladění (MDA) detekuje pokusy o spuštění spravovaného kódu ve vlákně, které obsahuje zámek zavaděče operačního systému Microsoft Windows. Jakékoli takové spuštění je nezákonné, protože může vést k zablokování a použití knihoven DLL dříve, než je zavaděč operačního systému inicializuje.

Příznaky

Nejběžnějším selháním při provádění kódu uvnitř zámku zavaděče operačního systému je, že vlákna při pokusu o volání jiných funkcí Win32, které také vyžadují zámek zavaděče, dojde k zablokování vláken. Příklady takových funkcí jsou LoadLibrary, GetProcAddress, FreeLibrary, a GetModuleHandle. Aplikace nemusí tyto funkce přímo volat; Modul CLR (Common Language Runtime) může tyto funkce volat jako výsledek volání vyšší úrovně, jako Load je nebo první volání metody vyvolání platformy.

K zablokování může dojít také v případě, že vlákno čeká na spuštění nebo dokončení jiného vlákna. Po spuštění nebo dokončení provádění vlákna musí získat zámek zavaděče operačního systému, aby bylo možné doručovat události ovlivněným knihovnám DLL.

A konečně existují případy, kdy volání knihoven DLL může nastat dříve, než byly tyto knihovny DLL správně inicializovány zavaděčem operačního systému. Na rozdíl od selhání vzájemného zablokování, které je možné diagnostikovat prozkoumáním zásobníků všech vláken zapojených do zablokování, je velmi obtížné diagnostikovat použití neinicializovaných knihoven DLL bez použití tohoto mdA.

Příčina

Smíšená spravovaná nebo nespravovaná sestavení jazyka C++ vytvořená pro rozhraní .NET Framework verze 1.0 nebo 1.1 se obecně pokoušejí spustit spravovaný kód uvnitř zámku zavaděče, pokud nebyla přijata zvláštní péče, například propojení s /NOENTRY.

Smíšená spravovaná nebo nespravovaná sestavení C++ vytvořená pro rozhraní .NET Framework verze 2.0 jsou méně náchylná k těmto problémům a mají stejné snížené riziko jako aplikace využívající nespravované knihovny DLL, které porušují pravidla operačního systému. Pokud například nespravovaný vstupní bod knihovny DLL DllMain volá CoCreateInstance k získání spravovaného objektu, který byl vystaven modelu COM, je výsledkem pokus o spuštění spravovaného kódu uvnitř zámku zavaděče. Další informace o problémech se zámkem zavaděče v rozhraní .NET Framework verze 2.0 a novějších naleznete v tématu Inicializace smíšených sestavení.

Rozlišení

V sadě Visual C++ .NET 2002 a Visual C++ .NET 2003 můžou knihovny DLL kompilované s možností kompilátoru /clr při načtení ne deterministicky zablokovat. Tento problém se označuje jako problém se smíšeným načtením knihovny DLL nebo zámkem zavaděče. V sadě Visual C++ 2005 a novějších byla téměř všechna ne determinismus odebrána z procesu načítání smíšené knihovny DLL. Existuje však několik zbývajících scénářů, pro které může dojít (deterministicky) k zámku zavaděče. Podrobný účet příčin a řešení zbývajících problémů se zámkem zavaděče najdete v tématu Inicializace smíšených sestavení. Pokud toto téma neidentifikuje váš problém se zámkem zavaděče, musíte prozkoumat zásobník vlákna, abyste zjistili, proč k zavaděče dochází a jak problém opravit. Podívejte se na trasování zásobníku pro vlákno, které aktivovalo toto MDA. Vlákno se pokouší neoprávněně zavolat do spravovaného kódu a přitom drží zámek zavaděče operačního systému. Pravděpodobně uvidíte v zásobníku vstupní bod knihovny DLL DllMain nebo ekvivalentní vstupní bod. Pravidla operačního systému pro to, co můžete právně dělat z takového vstupního bodu, jsou poměrně omezená. Tato pravidla zabraňují jakémukoliv spravovanému spuštění.

Vliv na modul runtime

Obvykle dojde k zablokování několika vláken uvnitř procesu. Jedno z těchto vláken bude pravděpodobně vlákno zodpovědné za provádění uvolňování paměti, takže toto zablokování může mít velký dopad na celý proces. Kromě toho zabrání jakýmkoli dalším operacím, které vyžadují zámek zavaděče operačního systému, jako je načítání a uvolňování sestavení nebo knihoven DLL a spouštění nebo zastavování vláken.

V některýchneobvyklých

Výstup

Tato autorita MDA hlásí, že se pokoušíte provést nelegální spravované spuštění. Je potřeba prozkoumat zásobník vlákna, abyste zjistili, proč dochází k zámku zavaděče a jak problém opravit.

Konfigurace

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

Viz také