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