Я пытаюсь устранить неполадки приложения COM +, которое периодически блокируется. В последний раз, когда он заблокировался, я смог получить дамп пользовательского режима процесса dllhost и проанализировать его с помощью WinDbg. После проверки всех потоков и блокировок все сводится к критическому разделу, принадлежащему этому потоку:
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, возможно ли, что он пытается пропинговать другой поток в уже заблокированном процессе?
UPDATE
На самом деле это оказалось ошибкой в клиенте Oracle 10.2.0.1. Хотя мне все еще интересны идеи о том, как я мог бы это выяснить, не найдя ошибки в базе данных ошибок Oracle.