Почему я получаю предупреждение «LoaderLock был обнаружен» при отладке? - PullRequest
15 голосов
/ 20 мая 2009

Я разрабатываю надстройку для AutoCAD 2009. Выходные данные проекта - это библиотека классов. Когда я пытаюсь отладить и загрузить библиотеку классов, я получаю сообщение «LoaderLock обнаружено». Я писал эти дополнения некоторое время, и это первое сообщение такого типа, которое я видел.

  1. С чего начать пытаться это выяснить?
  2. Что такое LoaderLock и почему он меня сейчас беспокоит?

LoaderLock был обнаружен Сообщение: попытка управляемого выполнения внутри блокировки загрузчика ОС. Не пытайтесь запускать управляемый код внутри функции инициализации DllMain или изображения, так как это может привести к зависанию приложения.

Я пошел на Debug -> Exceptions -> "Managed Debugging Assistants", нашел "LoaderLock" и снял флажок "Thrown".

Я могу снова отладить, но что я делал и почему я должен был это делать? Это вызовет у меня другие проблемы?

Ответы [ 3 ]

16 голосов
/ 20 мая 2009

Блокировка загрузчика - это блокировка всего процесса, используемая системой для синхронизации доступа к загрузке DLL в адресное пространство процесса. Функции, которые загружают DLL, бесплатные DLL, запрашивают информацию DLL и т. Д., Все получают блокировку загрузчика. Что больше всего влияет на разработчиков, так это то, что блокировка загрузчика удерживается во время работы DllMain - это означает, что блокировка ОС, о которой вы обычно не знаете, может удерживаться во время выполнения вашего кода.

Блокировку загрузчика можно рассматривать как находящуюся на очень низком уровне в иерархии блокировок. Код, работающий под блокировкой загрузчика во время DllMain, может быть причиной тупиков. Например, CLR имеет свой собственный набор внутренних блокировок, которые он может удерживать при загрузке DLL. Если вы вызываете управляемый код из вашего DllMain, вы можете заставить CLR вашего потока получить одну из этих блокировок, удерживая блокировку загрузчика. Если CLR в другом потоке получит эту блокировку (в результате чего поток источника в DllMain заблокируется), а затем попытается загрузить DLL, которая получит блокировку загрузчика, ваш процесс заблокируется.

Похоже, что CLR пытается превентивно обнаружить запуск управляемого кода под блокировкой загрузчика. Когда вы видите стек от этого сбоя в отладчике, определите причину выполнения управляемого кода из DllMain и удалите его.

3 голосов
/ 21 мая 2009

По моему опыту работы с AutoCAD, предупреждение LoaderLock можно смело игнорировать. Это не признак того, что ваш код делает что-то не так, скорее предупреждение, потому что AutoCAD загружает и инициализирует ваше приложение.

1 голос
/ 29 декабря 2011

Это ошибка в Visual Studio 2005. Прочтите эту статью для более подробной информации: http://support.microsoft.com/kb/913996

...