为什么我在调试时收到“检测到LoaderLock”警告?

时间:2009-05-20 19:19:53

标签: visual-studio-2005 class-library autocad

我正在为AutoCAD 2009开发一个附加组件。项目输出是一个类库。当我尝试调试并加载类库时,我得到了“LoaderLock被检测到的消息”。我一直在写这些附加组件,这是我见过的第一个这种类型的消息。

  1. 我从哪里开始尝试解决这个问题?
  2. 什么是LoaderLock,为什么现在困扰我?
  3. 检测到LoaderLock 消息:尝试在OS Loader锁定内执行托管执行。不要尝试在DllMain或图像初始化函数中运行托管代码,因为这样做会导致应用程序挂起。

    我转到Debug -> Exceptions -> "Managed Debugging Assistants",找到"LoaderLock"并取消选中"Thrown"复选框。

    我可以再次调试,但我做了什么,为什么我必须这样做?这会给我带来其他问题吗?

3 个答案:

答案 0 :(得分:16)

加载程序锁是一个进程范围的锁,系统使用它来将对加载DLL的访问同步到进程地址空间。加载DLL,免费DLL,查询DLL信息等的函数都获取加载器锁。最常影响开发人员的是在DllMain运行时保持加载程序锁定 - 这意味着在运行代码时可以保留通常不知道的操作系统锁定。

可以将加载程序锁定视为锁定层次结构中的非常低级别。在DllMain期间在加载程序锁定下运行的代码可能是死锁的原因。例如,CLR有自己的一组内部锁,它可以在加载DLL时保存。如果从DllMain中调用托管代码,则可能导致线程上的CLR在保持加载程序锁定的同时获取其中一个锁定。如果另一个线程上的CLR获得了该锁(导致DllMain中的原始线程阻塞)然后尝试加载一个将获取加载器锁的DLL,那么您的进程将会死锁。

听起来CLR正试图抢先检测加载程序锁定下运行的托管代码。当您在调试器中看到此故障的堆栈时,请确定导致托管代码在DllMain中运行的原因并将其删除。

答案 1 :(得分:3)

根据我使用AutoCAD的经验,可以安全地忽略LoaderLock警告。这并不表示您的代码出错了,而是由于AutoCAD加载和初始化应用程序的方式而引发警告。

答案 2 :(得分:1)

这是Visual Studio 2005中的一个错误。请阅读本文以获取更多详细信息:http://support.microsoft.com/kb/913996