多线程应用程序在 WinDbg 中 运行 !ntsdexts.locks 时仅显示一个线程。如何知道其他线程导致死锁?

Multi-threaded application shows only one thread when running !ntsdexts.locks in WinDbg. How to know other thread causing deadlock?

我正在尝试使用 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