我正在嘗試排查間歇性死鎖的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缺陷數據庫中的錯誤的情況下了解這些想法感興趣。