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 ................
如果所有者線程不再存在,那麼有人可能會在其上調用TerminateThread。 –
我已經從我的代碼中移除了對TerminateThread的所有調用。只有一個。我的代碼沒有DllMains。我有一個我鏈接到的DLL,但它沒有。我使用幾個COM DLL,我肯定有DllMains我有一些他們的源代碼。有什麼我應該在他們中尋找? –