2009-05-20 3 views
15

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

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

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

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

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

ответ

16

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

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

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

3

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

+0

Я пометил этот ответ на @ Боян-Резник, как полезным, поскольку он потенциально отвечает на последний вопрос ОР: это будет вызывать другие проблемы для меня? Ответ «возможно, нет, проблема» может быть просто проблемой отладчика, и ее можно игнорировать ». Я считаю это полезным, хотя информация от Майкла, конечно, также очень полезна для понимания проблемы. – TonyG

1

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

+3

Этот КБ был хорошей находкой, но я часто вижу эту ошибку в VS2010SP1 при отладке Excel XLL Addin - вот что привело меня к этой теме. – TonyG

Смежные вопросы