为什么我的程序在拥有线程的情况下生成LdrpLoaderLock死锁

Why does my program generate LdrpLoaderLock deadlock with owning thread?

本文关键字:情况下 LdrpLoaderLock 死锁 线程 我的 程序 拥有 为什么      更新时间:2023-10-16

我开发了一个已经工作多年的c++应用程序。我们最近在测试实验室增加了一些4台处理器测试机。

之后,我们发现负载下的特定测试会间歇性地导致LdrpLoaderLock死锁,而拥有线程不再运行。拥有线程id通常是从运行线程推断出的可能的线程id,并且锁内存结构看起来不会损坏。

我在调试器中没有遇到此问题。我只是能够在它发生之后再看它。我开始记录我正在创建的所有线程,但我在那里没有看到问题线程id。不过,这可能没有意义,因为死锁发生后,日志记录可能无法工作。我想我需要一种跟踪线程创建和入口点的方法,这样我就可以知道是哪个线程在做这件事。感谢您的帮助。

来自windbg

0:000>!锁定CritSec ntdll!Ldrp装载机锁定+0,775d20c0WaiterWoken否锁定计数5递归计数2拥有线程f38入口计数0内容计数5***锁定

扫描805个关键部分

0:000>!螺纹指数TID0 00000 ab8100000 8cc20万e683 0000134c400000c445 0000113060万f1870000009088 0000108490000000 f0810 0000109811 000010101200万d4013 0000135c

线程堆栈消耗的VM总数0x031cf000

0:000>d 775d20c0775d20c0 60 43 5d 77 ea-fff ff-02 00 00 00 38 0f 00 00 `C]w。。。。。。。。8.775d20d0 ac 04 00 00 00 00 00-40 43 5d 77 ff ff ff ff@C] w。。。。775d20e00 00 00 00 000 00 00 00-00 00 00 00 02。。。。。。。。。。。。。。。。775d20f00 00 00 00 000 00 00 00-00 00 00 00。。。。。。。。。。。。。。。。775d2100 00 49 5d 77 ff ff ff ff-00 00 00 00 00 00.I]w。。。。。。。。。。。。775d2110 00 00 00 00 000 00 00-00 00 00 00。。。。。。。。。。。。。。。。775d2120 20 49 5d 77 ff ff ff ff-00 00 00 00 00 00I]w。。。。。。。。。。。。775d2130 00 00 00 00 a0 0f 00 00-00 00 00 00

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