2012-12-11 37 views
3

我開發了一個多年來一直在努力的C++應用程序。我們最近添加了一些4處理器測試機器到我們的測試實驗室爲什麼我的程序通過擁有線程生成LdrpLoaderLock死鎖?

這樣做後,我們發現負載下的特定測試間歇性地導致LdrpLoaderLock死鎖,擁有的線程不再運行。擁有的線程ID通常在數值上暗示爲從正在運行的線程外推的可能的線程ID,並且鎖存儲器結構看起來不會損壞。

我在調試器中沒有得到這個問題。發生後我只能看它。我開始記錄我創建的所有線程,並且在那裏看不到問題線程ID。這可能沒有意義,儘管可能在死鎖發生後日志記錄不起作用。我想我需要一種方法來跟蹤線程創建和入口點,以便我可以確定哪個線程正在執行此操作。任何幫助表示讚賞。

從WinDbg的

 
0:000> !locks 
CritSec ntdll!LdrpLoaderLock+0 at 775d20c0 
WaiterWoken  No 
LockCount   5 
RecursionCount  2 
OwningThread  f38 
EntryCount   0 
ContentionCount 5 
*** Locked 

掃描805個的關鍵部分

 
0:000> !threads 
Index TID 
0 00000ab8 
1 000008cc 
2 00000e68 
3 0000134c 
4 00000c44 
5 000011a0 
6 00000f18 
7 00000908 
8 00001084 
9 00000f08 
10 00001098 
11 00001010 
12 00000d40 
13 0000135c 

由線程所消耗的總VM棧0x031cf000

 
0:000> d 775d20c0 
775d20c0 60 43 5d 77 ea ff ff ff-02 00 00 00 38 0f 00 00 `C]w........8... 
775d20d0 ac 04 00 00 00 00 00 00-40 43 5d 77 ff ff ff ff [email protected]]w.... 
775d20e0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 02 ................ 
775d20f0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
775d2100 00 49 5d 77 ff ff ff ff-00 00 00 00 00 00 00 00 .I]w............ 
775d2110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
775d2120 20 49 5d 77 ff ff ff ff-00 00 00 00 00 00 00 00 I]w............ 
775d2130 00 00 00 00 a0 0f 00 00-00 00 00 00 00 00 00 00 ................ 
+3

如果所有者線程不再存在,那麼有人可能會在其上調用TerminateThread。 –

+0

我已經從我的代碼中移除了對TerminateThread的所有調用。只有一個。我的代碼沒有DllMains。我有一個我鏈接到的DLL,但它沒有。我使用幾個COM DLL,我肯定有DllMains我有一些他們的源代碼。有什麼我應該在他們中尋找? –

回答

0

雷蒙德陳是正確的。我打電話給第三方com組件。它正在創建一個線程,然後在析構函數中調用TerminateThread。幸運的是,我有一個源許可證,否則我將永遠處於虧損狀態。在那個析構函數中註釋TerminateThread調用並重建修復了我的問題。現在讓第三方修正他們的代碼。