Почему я получаю предупреждение "LoaderLock был обнаружен" при отладке?

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

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

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

я пошел в Debug -> Exceptions -> "Managed Debugging Assistants", найденный "LoaderLock" и снял отметку "Thrown" флажок.

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

3 ответа

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

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

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

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

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

Другие вопросы по тегам