Debugging !syncblk标识等待线程
当我发牢骚的时候!windbg的死锁应用程序上的syncblk命令,我得到 下面的输出。它显示哪个线程持有锁。但事实并非如此 指示哪些线程正在等待锁定。我怎样才能识别 正在等待的线程Debugging !syncblk标识等待线程,debugging,windbg,Debugging,Windbg,当我发牢骚的时候!windbg的死锁应用程序上的syncblk命令,我得到 下面的输出。它显示哪个线程持有锁。但事实并非如此 指示哪些线程正在等待锁定。我怎样才能识别 正在等待的线程 0:004> !syncblk Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner 2 0016d12c 3 1 0014b1c0 1ab8 0 01292e3
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
您可以使用
~*e查看所有托管堆栈!clrstack
。如果线程正在等待获取锁,您应该在其堆栈中看到一些适当的帧(例如,Monitor.TryEnter
)。您可以使用~*e!clrstack
。如果线程正在等待获取锁,您应该在其堆栈中看到一些适当的帧(例如,Monitor.TryEnter
)。如果您正在对死锁问题进行故障排除,您的第一个操作应该是加载并尝试!dlk
命令,因为它将基于监视器和读写器写锁来识别死锁。它甚至可以精确定位源代码中的确切位置
在某些情况下,!dlk
命令未按预期识别死锁。在这种情况下,您需要使用!根据您的问题同步块
。要查找哪个线程试图获取特定锁,可以使用~*e!正如@Liran指出的那样,clrstack
。但是,您也可以使用~*e!dso
(将转储堆栈上不同线程的引用)并查找对锁对象的引用 如果您正在对死锁问题进行故障排除,您的第一个操作应该是加载并尝试!dlk
命令,因为它将基于监视器和读写器写锁来识别死锁。它甚至可以精确定位源代码中的确切位置
在某些情况下,!dlk
命令未按预期识别死锁。在这种情况下,您需要使用!根据您的问题同步块
。要查找哪个线程试图获取特定锁,可以使用~*e!正如@Liran指出的那样,clrstack
。但是,您也可以使用~*e!dso
(将转储堆栈上不同线程的引用)并查找对锁对象的引用 你读过我在上一个问题“如何调试死锁”中发布的链接上的那篇文章吗?@Mitch Wheat:我第一次读这篇文章时错过了这篇文章。谢谢你,你读了我在上一个问题“如何调试死锁”中发布的链接上的那篇文章了吗?@Mitch Wheat:我第一次读这篇文章时错过了这篇文章。非常感谢。