【问题标题】:Why does my program generate LdrpLoaderLock deadlock with owning thread?为什么我的程序会在拥有线程的情况下生成 LdrpLoaderLock 死锁?
【发布时间】:2012-12-11 20:31:47
【问题描述】:

我开发了一个多年来一直在开发的 c++ 应用程序。我们最近在我们的测试实验室中添加了一些 4 台处理器测试机器。

这样做之后,我们发现负载下的特定测试会间歇性地导致 LdrpLoaderLock 死锁,并且所属线程不再运行。拥有线程 id 通常在数字上暗示为从正在运行的线程推断出的可能的线程 id,并且锁内存结构看起来没有损坏。

我在调试器中没有遇到这个问题。我只能在它发生后看看它。我开始记录我正在创建的所有线程,但我没有在其中看到问题线程 ID。这可能没有意义,因为在死锁发生后日志记录可能无法工作。我想我需要一种方法来跟踪线程创建和入口点,这样我就可以找出哪个线程正在执行此操作。任何帮助表示赞赏。

来自windbg

0:000> !锁 CritSec ntdll!LdrpLoaderLock+0 at 775d20c0 服务员醒了 没有 锁数 5 递归计数 2 拥有线程 f38 条目数 0 争用计数 5 *** 锁定

扫描 805 个关键部分

0:000> !线程 索引 TID 0 00000ab8 1 000008cc 2 00000e68 3 0000134c 4 00000c44 5 000011a0 6 00000f18 7 00000908 8 00001084 9 00000f08 10 00001098 11 00001010 12 00000d40 13 0000135c

线程堆栈0x031cf000消耗的总VM

0:000> d 775d20c0 775d20c0 60 43 5d 77 一个 ff ff ff-02 00 00 00 38 0f 00 00 `C]w........8... 775d20d0 ac 04 00 00 00 00 00 00-40 43 5d 77 ff ff ff ........@C]w.... 775d20e0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 02 ...... 775d20f0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...... 775d2100 00 49 5d 77 ff ff ff ff-00 00 00 00 00 00 00 00 .I]w............ 775d2110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...... 775d2120 20 49 5d 77 ff ff ff ff-00 00 00 00 00 00 00 00 I]w............ 775d2130 00 00 00 00 a0 0f 00 00-00 00 00 00 00 00 00 00 ......

【问题讨论】:

  • 如果所有者线程不再存在,那么可能有人在其上调用了TerminateThread
  • 我已经从我的代码中删除了所有对 TerminateThread 的调用。只有一个。我的代码没有 DllMains。我确实有一个链接到的 Dll,但它没有。我正在使用几个 com DLL,我确信它们有 DllMains 我有其中一些的源代码。有什么我应该在其中寻找的吗?

标签: c++ multithreading winapi deadlock


【解决方案1】:

Raymond Chen 是正确的。我正在调用第三方 com 组件。它正在创建一个线程,然后在析构函数中调用 TerminateThread。幸运的是,我有源许可证,否则我将永远不知所措。注释掉该析构函数中的 TerminateThread 调用并重建解决了我的问题。现在让第 3 方修复他们的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多