Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging !syncblk标识等待线程_Debugging_Windbg - Fatal编程技术网

Debugging !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

当我发牢骚的时候!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 

您可以使用
~*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:我第一次读这篇文章时错过了这篇文章。非常感谢。