2010-08-22 161 views
1

当我在ssued!syncblk命令上对来自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

您是否在链接上阅读了关于如何调试死锁的文章? – 2010-08-22 05:05:09

+0

@Mitch小麦:我第一次读这篇文章时就错过了。谢谢 – Maanu 2010-08-22 06:17:00

回答

2

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

1

如果您要解决死锁问题,你的第一个动作应该是加载SOSEX.dll并尝试!dlk命令,因为它会识别基于MonitorReaderWriteLock死锁。它甚至会精确确定源代码中的确切位置。

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