Assistant Débogage managé loaderLock
Mise à jour : novembre 2007
L'Assistant Débogage managé (MDA, Managed Debugging Assistant) loaderLock détecte des tentatives d'exécution du code managé sur un thread qui détient le verrou du système d'exploitation Microsoft Windows. Toute exécution de ce type est illégale car elle peut mener à des blocages et à l'utilisation de DLL avant qu'elles aient été initialisées par le chargeur du système d'exploitation.
Symptômes
Lors de l'exécution de code à l'intérieur du verrou du chargeur du système d'exploitation, la cause d'échec la plus courante est le blocage des threads lors de leur tentative d'appel à d'autres fonctions Win32 qui ont également besoin du verrou du chargeur. Les fonctions LoadLibrary, GetProcAddress, FreeLibrary et GetModuleHandle en sont quelques exemples. Il est possible que l'application n'appelle pas directement ces fonctions ; le Common Language Runtime (CLR) peut appeler ces fonctions à la suite d'un appel de niveau supérieur comme Load ou du premier appel à une méthode d'appel de code non managé.
Des blocages peuvent également se produire si un thread attend le début ou la fin de l'exécution d'un autre thread. Lorsqu'un thread démarre ou termine son exécution, il doit acquérir le verrou du chargeur du système d'exploitation pour remettre des événements aux DLL concernées.
Enfin, dans certains cas, des appels de DLL peuvent se produire avant que ces DLL aient été correctement initialisées par le chargeur du système d'exploitation. À la différence des échecs dus à un blocage, qui peuvent être diagnostiqués par l'examen des piles de tous les threads impliqués dans le blocage, il est très difficile de diagnostiquer l'utilisation de DLL non initialisées sans utiliser cet Assistant Débogage managé.
Cause
Des assemblys C++ combinant du code managé/non managé créés pour les versions 1.0 ou 1.1 du .NET Framework tentent généralement d'exécuter le code managé à l'intérieur du verrou du chargeur à moins que certaines mesures spéciales aient été prises, par exemple, une liaison à /NOENTRY. Pour une description détaillée de ces problèmes, consultez « Mixed DLL Loading Problem » dans MSDN Library.
Des assemblys C++ combinant du code managé/non managé et créés pour le .NET Framework version 2.0 sont moins vulnérables à ces problèmes et présentent des risques plus limités, au même titre que les applications qui utilisent des DLL non managées enfreignant les règles du système d'exploitation. Par exemple, si le point d'entrée DllMain d'une DLL non managée appelle CoCreateInstance pour obtenir un objet managé qui a été exposé à COM, cela se traduit par une tentative d'exécution du code managé à l'intérieur du verrou du chargeur.
Résolution
Examinez la trace de la pile du thread qui a activé cet Assistant Débogage managé. Le thread tente d'exécuter un appel illégal dans le code managé tout en maintenant le verrouillage du chargeur du système d'exploitation. Vous verrez probablement le point d'entrée DllMain ou un point d'entrée équivalent d'une DLL sur la pile. Les règles du système d'exploitation quant aux actions autorisées à l'intérieur d'un tel point d'entrée sont assez limitées. Ces règles interdisent toute exécution managée.
Effet sur le runtime
En général, plusieurs threads à l'intérieur du processus se bloqueront. Il est probable que l'un ces threads soit un thread chargé d'exécuter un garbage collection, par conséquent, ce blocage peut avoir une incidence majeure sur tout le processus. En outre, il empêchera toute opération supplémentaire exigeant le verrouillage du chargeur du système d'exploitation, comme le chargement et le déchargement des assemblys ou des DLL ainsi que le démarrage et l'arrêt des threads.
Dans certaines circonstances exceptionnelles, il est également possible que des violations d'accès ou des problèmes similaires soient déclenchés dans des DLL appelées avant d'avoir été initialisées.
Sortie
Cet Assistant Débogage managé signale une tentative d'exécution managée illégale. Vous devez examiner la pile du thread pour déterminer la raison du verrouillage du chargeur et comment résoudre le problème.
Configuration
<mdaConfig>
<assistants>
<loaderLock/>
</assistants>
</mdaConfig>
Voir aussi
Concepts
Diagnostic d'erreurs avec les Assistants de débogage managés