我的应用程序陷入僵局。有没有办法识别目前锁定的对象(如下所示)?
void DoWork()
{
lock(this._lockObj)
{
// Do some work
}
}
答案 0 :(得分:6)
执行此操作的最佳方法是使用WinDbg和SOS扩展。它有一个名为!SyncBlk
的命令,它只提供此信息。这是一个快速教程的链接
答案 1 :(得分:4)
如果您在Visual Studio下进行调试,那就不难了。特别需要两个调试窗口:调用堆栈和线程。暂停程序,然后在线程窗口中双击每个线程,找到它当前停止的位置。死锁线程应该在“锁定”语句中停止执行。
然后,在每个死锁线程上,您可以跟踪堆栈中的路径以找到另一个锁定。只需双击调用中的每个方法并查看上下文,直到找到您所在的另一个锁。