繁体   English   中英

解决COM +应用程序死锁问题

[英]Troubleshooting a COM+ application deadlock

我正在尝试解决间歇性死锁的COM +应用程序。 它最后一次锁定,我能够获取dllhost进程的usermode转储并使用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,是否有可能它正在尝试ping已经死锁的进程中的另一个线程?

UPDATE
这实际上是Oracle 10.2.0.1客户端中的一个错误。 虽然,我仍然对如何在没有发现Oracle错误数据库中的错误的情况下想出这个问题的想法感兴趣。

您可以使用!locks ,它将尝试自动分析死锁,然后转储线程~* kb的调用堆栈,并检查哪些线程正在等待临界区或事件对象。

这里有一个例子: http//www.dumpanalysis.org/blog/index.php/2007/07/28/crash-dump-analysis-patterns-part-9c/

加上这个人的网站有很多使用WinDbg用于其他类型死锁的例子,包括托管代码: http//www.dumpanalysis.org/只需在页面上搜索“死锁”,希望这会有所帮助。

SIEExtPub可以帮助您找出COM中的锁

这是关于这个的文章

如果您在使用此扩展程序时遇到任何问题,请回复

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM