【问题标题】:!syncblk identify waiting threads!syncblk 识别等待线程
【发布时间】:2010-09-30 06:54:15
【问题描述】:

当我从 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 

【问题讨论】:

  • 您是否阅读了我在您上一个问题中发布的链接中关于如何调试死锁的那篇文章?
  • @Mitch Wheat:我第一次读这篇文章时错过了这个。谢谢

标签: debugging windbg


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-11
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2011-08-13
      相关资源
      最近更新 更多