代码之家  ›  专栏  ›  技术社区  ›  Oskar

我如何在windbg中找到我的读写器锁的锁夹(读卡器)

  •  2
  • Oskar  · 技术社区  · 16 年前

    我有一个.NET进程的转储文件,该进程由于死锁而挂起(GUI线程不再响应,我的日志显示一些线程已停止响应)。我已经拍了一张快照,现在正在windbg中查看,所有线程都在等待最后一个线程。看那条线的stacktrace!clrstack-p我可以看到它正在试图获取读写器锁上的一个写操作。

    我该如何判断哪个线程持有该锁,以便开始了解死锁是如何发生的?

    谢谢

    [编辑]显然有一个命令!rwlocks在.net1.1sos.dll中帮助解决这个问题,但在.net2.0版本中没有。狩猎还在继续

    5 回复  |  直到 15 年前
        1
  •  1
  •   Carl Serrander    16 年前

    我不太确定,但你可能会使用!要查看同步块对象,如果在没有任何参数的情况下调用它,我认为应该看到线程拥有的同步块。

    如果有同步块死锁,则扩展名 SOSEX 可能是你需要的。这个扩展提供了命令!显示哪些线程正在等待哪个锁的DLK。这只适用于同步块,但是,如果使用lock()(monitor.enter),则不会检测到其他同步对象上的死锁,这对您来说应该不是问题。

        2
  •  1
  •   Ilya Ryzhenkov    16 年前

    尝试 sosex 而且!DLK

        3
  •  1
  •   Community tir38    7 年前

    我在这里发布了一个模拟主题, Using C# is it possible to test if a lock is held on a file

    我引用了很多文章等等,但是等待链遍历(wait-chain-traversal,WCT)可以帮助您,它有点敏感,但是这个msdn-mag bugslayer 文章展示了如何在托管上下文中在windbg中使用wct。

        4
  •  0
  •   Oskar    16 年前

    到目前为止,最好的方法是看!DSO用于所有线程堆栈,并查看哪些线程堆栈引用了锁。之后的快速检查让我们能够跟踪哪些线程持有锁。不过,这不是一个很好或很快的方法…

        5
  •  0
  •   dviljoen    16 年前

    提供可跟踪性的方法是将锁包装到IDisposable接口中并替换:

    锁(mylock)…}

    具有

    使用(new disposable elock())…}

    您可以将构造函数和dispose()方法记录到控制台、log4net或其他机制中。这将允许您看到什么是被锁定的,什么是被阻塞的。