我的应用程序处于死锁状态。有没有什么方法可以识别目前锁定的物体(如下所示)?查找锁定对象
void DoWork()
{
lock(this._lockObj)
{
// Do some work
}
}
我的应用程序处于死锁状态。有没有什么方法可以识别目前锁定的物体(如下所示)?查找锁定对象
void DoWork()
{
lock(this._lockObj)
{
// Do some work
}
}
做到这一点,最好的办法是使用WinDbg和SOS扩展。它有一个名为!SyncBlk
的命令,它提供了这些信息。下面是一个快速教程
感谢您的信息。真棒工具! – 2011-04-29 00:00:54
链接如果你的Visual Studio调试下,这不是太硬。特别需要两个调试窗口:调用堆栈和线程。暂停程序,然后在线程窗口中双击每个线程,找到当前停止的位置。死锁线程应该在“锁定”语句中停止它们的执行。
然后,在每个死锁线程上,您可以追踪堆栈以找到其他锁。只需双击通话中的每个方法,然后查看上下文,直到找到另一个内部锁。
如果有帮助,可以使用'Monitor.TryEnter'来评估一个特定的对象是否被锁定。 – mquander 2010-08-20 15:15:30
dupe? http://stackoverflow.com/questions/1300199/c-anyway-to-detect-if-an-object-is-locked – 2010-08-20 15:16:45
可能的重复[确定持有锁的线程](http://stackoverflow.com/questions/3523544/identify-the-thread-which-holds-the-lock) – 2010-08-20 15:17:32