2009-05-20 51 views
15

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

  1. 我从哪里开始试图弄清楚这一点?
  2. 什么是LoaderLock,它为什么现在困扰我?

LoaderLock被检测到 消息:试图在OS Loader锁内执行托管执行。不要试图在DllMain或图像初始化函数中运行托管代码,因为这样做会导致应用程序挂起。

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

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

回答

16

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

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

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

3

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

+0

我标志着@博扬 - 雷斯尼克这种反应是有用的,因为它潜在地回答了OP的最后一个问题:这是否会导致其他问题为了我?答案是“可能不是,这个问题”可能只是一个调试问题,而且可以忽略。“我觉得这很有帮助,虽然迈克尔的信息当然也对理解问题很有帮助。 – TonyG 2012-03-08 19:15:05

1

在Visual Studio 2005中的错误阅读这篇文章,了解详情:http://support.microsoft.com/kb/913996

+3

该KB是一个很好的发现,但是在调试Excel XLL Addin时,我经常在VS2010SP1中看到这个错误 - 这正是我引入此线程的原因。 – TonyG 2012-03-08 19:13:20

相关问题