4

我开发了一个多年来一直在开发的 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

线程堆栈消耗的总 VM 0x031cf000

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 ......
4

1 回答 1

1

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

于 2012-12-13T21:34:46.430 回答