!syncblk识别等待的线程

时间:2010-08-22 04:51:26

标签: debugging windbg

当我ssued!来自windbg的死锁应用程序上的syncblk命令时,我得到了 以下输出。它显示哪个线程持有锁。但事实并非如此 指示哪些线程正在等待锁定。我怎样才能识别出来 正在等待的线程? 。

0:004> !syncblk 
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner 
2      0016d12c  3           1        0014b1c0 1ab8 0    01292e3c System.Object 
----------------------------- 
Total 2 
CCW 0 
RCW 0 
ComClassFactory 0 
Free 0 

2 个答案:

答案 0 :(得分:2)

您可以使用~*e!clrstack查看所有托管堆栈。如果线程正在等待获取锁定,您应该在其堆栈中看到一些适当的帧(例如,Monitor.TryEnter)。

答案 1 :(得分:1)

如果您正在解决死锁问题,那么您的第一个操作应该是加载SOSEX.dll并尝试!dlk命令,因为它会根据Monitor和{{1来识别死锁}}。它甚至可以精确定位源代码中的确切位置。

在某些情况下,ReaderWriteLock命令无法按预期识别死锁。在这种情况下,您需要根据您的问题使用!dlk。要查找尝试获取特定锁的线程,可以使用!syncblock作为@Liran指出。但是,您也可以使用~*e!clrstack(它将在堆栈上转储不同线程的引用)并查找对象的引用。