多线程应用程序在 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
我正在尝试使用 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