当我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
答案 0 :(得分:2)
您可以使用~*e!clrstack
查看所有托管堆栈。如果线程正在等待获取锁定,您应该在其堆栈中看到一些适当的帧(例如,Monitor.TryEnter
)。
答案 1 :(得分:1)
如果您正在解决死锁问题,那么您的第一个操作应该是加载SOSEX.dll并尝试!dlk
命令,因为它会根据Monitor
和{{1来识别死锁}}。它甚至可以精确定位源代码中的确切位置。
在某些情况下,ReaderWriteLock
命令无法按预期识别死锁。在这种情况下,您需要根据您的问题使用!dlk
。要查找尝试获取特定锁的线程,可以使用!syncblock
作为@Liran指出。但是,您也可以使用~*e!clrstack
(它将在堆栈上转储不同线程的引用)并查找对象的引用。