2010-03-03 71 views
3

我正在嘗試排查間歇性死鎖的COM +應用程序故障。上次鎖定時,我能夠獲取dllhost進程的用戶模式轉儲並使用WinDbg進行分析。檢查所有的線程和鎖後,這一切都歸結爲這個線程擁有一個關鍵部分:COM +應用程序死鎖故障排除

ChildEBP RetAddr Args to Child    
0deefd00 7c822114 77e6bb08 000004d4 00000000 ntdll!KiFastSystemCallRet 
0deefd04 77e6bb08 000004d4 00000000 0deefd48 ntdll!ZwWaitForSingleObject+0xc 
0deefd74 77e6ba72 000004d4 00002710 00000000 kernel32!WaitForSingleObjectEx+0xac 
0deefd88 75bb22b9 000004d4 00002710 00000000 kernel32!WaitForSingleObject+0x12 
0deeffb8 77e660b9 000a5cc0 00000000 00000000 comsvcs!PingThread+0xf6 
0deeffec 00000000 75bb21f1 000a5cc0 00000000 kernel32!BaseThreadStart+0x34 

它等待的對象是一個事件:

0:016> !handle 4d4 f 
Handle 000004d4 
    Type   Event 
    Attributes 0 
    GrantedAccess 0x1f0003: 
     Delete,ReadControl,WriteDac,WriteOwner,Synch 
     QueryState,ModifyState 
    HandleCount 2 
    PointerCount 4 
    Name   <none> 
    No object specific information available 

至於我可以告訴,事件永遠不會發出信號,導致線程掛起並阻塞進程中的其他幾個線程。有沒有人對接下來的步驟有什麼建議來確定發生了什麼?

現在,看到該方法稱爲PingThread,是否有可能試圖在已經死鎖的進程中ping另一個線程?

UPDATE
這實際上竟然是在Oracle 10.2.0.1客戶端的錯誤。儘管如此,我仍然對如何在沒有發現Oracle缺陷數據庫中的錯誤的情況下了解這些想法感興趣。

回答

0

SIEExtPub可以幫助你找出鎖在COM

這裏是article這個

如果您在使用本擴展任何問題請回來後

0

你可以使用!locks將嘗試自動分析死鎖,然後轉儲線程~* kb的調用堆棧,並檢查哪些線程正在等待臨界區或事件對象。

有一個例子使用這裏:http://www.dumpanalysis.org/blog/index.php/2007/07/28/crash-dump-analysis-patterns-part-9c/

再加上那傢伙的網站有許多使用WinDbg的其他類型的死鎖,包括託管代碼的例子:http://www.dumpanalysis.org/只是做了「僵局」頁面上的搜索,希望這有助於。