【问题标题】:Troubleshooting a COM+ application deadlockCOM+ 应用程序死锁故障排除
【发布时间】:2011-01-23 09:45:44
【问题描述】:

我正在尝试对间歇性死锁的 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,它是否可能正在尝试 ping 进程中已经死锁的另一个线程?

更新
这实际上是 Oracle 10.2.0.1 客户端中的一个错误。不过,我仍然对如何在不在 Oracle 的错误数据库中找到错误的情况下解决这个问题的想法感兴趣。

【问题讨论】:

    标签: windbg deadlock com+


    【解决方案1】:

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

    这里是article 关于这个

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-15
        • 1970-01-01
        • 2020-10-27
        • 2012-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多