我正在尝试使用 windbg 调试多线程应用程序死锁。
当我在 windbg 中运行 !ntsdexts.locks
命令时,它只显示一个线程作为输出。
我怎样才能找到阻塞它的其他线程?
我没有得到任何关于调试哪个部分的提示!
0:027> !ntsdexts.locks
CritSec +6ec98b00 at 000001cc6ec98b00
WaiterWoken No
LockCount 2
RecursionCount 1
OwningThread 277c
EntryCount 0
ContentionCount 18
*** Locked
Scanned 13 critical sections
最佳答案
该命令为您提供临界区和所属线程,即 277c
。
您现在需要找出该线程正在做什么。从 ~~[277c]s
开始,查看调用堆栈。它可能只是处于无限循环中,但也可能处于 WaitForSingleObject()
或 WaitForMultipleObjects()
调用中。
获取作为参数传递给任一 Wait...()
函数的参数,并查看该线程正在等待什么。可能是另一个关键部分,但可能是一些不同的同步对象。试着找出谁是那东西的主人。
继续这样,直到您回到线程 277c
并且您已确认死锁链。
这种手动方法可能非常乏味。您可能想尝试一些自动化分析:
!analyze -hang
可以提供有用的见解!sosex.dlk
可以只分析关键部分之间的死锁,但是很完整(你得到了所有需要的信息)- 使用Debug Diag Hang Analysis
关于c++ - 多线程应用程序在 WinDbg 中运行 !ntsdexts.locks 时仅显示一个线程。如何知道其他线程导致死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55948178/