2009-05-20 86 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

相關問題