<分区>
Possible Duplicate:
C#/.NET analysis tool to find race conditions/deadlocks
我正在调试一个我怀疑会死锁和挂起的应用程序。但是,这只会每隔几天发生一次,而且它从未在我的计算机上发生过,所以我无法将调试器连接到它。是否有任何实用程序或方法可用于查询正在运行的应用程序并找出哪些方法/锁/无论它死锁在什么上?
更新:通常应用程序在客户位置运行,而我无法访问机器,而且我不太愿意要求他们安装大量软件。
<分区>
Possible Duplicate:
C#/.NET analysis tool to find race conditions/deadlocks
我正在调试一个我怀疑会死锁和挂起的应用程序。但是,这只会每隔几天发生一次,而且它从未在我的计算机上发生过,所以我无法将调试器连接到它。是否有任何实用程序或方法可用于查询正在运行的应用程序并找出哪些方法/锁/无论它死锁在什么上?
更新:通常应用程序在客户位置运行,而我无法访问机器,而且我不太愿意要求他们安装大量软件。
最佳答案
您可以使用 WinDbg检查应用程序中的线程。以下是您可以执行的操作的简要计划。
!threads
命令将显示应用程序中的所有线程,!clrstack
命令将显示它们在做什么。使用~e!clrstack
转储所有线程的调用堆栈。在指示锁定时查找对 Wait 方法的调用。!syncblk
命令将为您提供有关哪些线程持有不同锁的信息。!dso
)。从这里您应该能够找到线程试图获取的锁。 澄清:WinDbg 不需要常规安装。只需复制文件。此外,如果您采用挂起转储,则可以根据需要在另一台机器上继续调试。
添加:Sosex具有 !dlk
命令,可在许多情况下自动识别死锁。它不会一直工作,但当它工作时,它会为您完成所有工作,因此这应该是您的首选。
关于c# - 检测 C# 应用程序中的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/508398/