c# - 检测 C# 应用程序中的死锁

标签 c# multithreading deadlock

<分区>

Possible Duplicate:
C#/.NET analysis tool to find race conditions/deadlocks

我正在调试一个我怀疑会死锁和挂起的应用程序。但是,这只会每隔几天发生一次,而且它从未在我的计算机上发生过,所以我无法将调试器连接到它。是否有任何实用程序或方法可用于查询正在运行的应用程序并找出哪些方法/锁/无论它死锁在什么上?

更新:通常应用程序在客户位置运行,而我无法访问机器,而且我不太愿意要求他们安装大量软件。

最佳答案

您可以使用 WinDbg检查应用程序中的线程。以下是您可以执行的操作的简要计划。

  • 当应用程序挂起时,将 WinDbg 文件复制到机器上。
  • 将 WinDbg 附加到进程或使用 ADPlus 获取进程的挂起转储。如果您选择 ADPlus,则可以在 WinDbg 中加载转储。
  • 从 WinDbg 加载 sos.dll,以便检查托管代码。
  • !threads 命令将显示应用程序中的所有线程,!clrstack 命令将显示它们在做什么。使用~e!clrstack 转储所有线程的调用堆栈。在指示锁定时查找对 Wait 方法的调用。
  • !syncblk 命令将为您提供有关哪些线程持有不同锁的信息。
  • 要找出给定线程试图获取的锁,请切换到该线程并检查堆栈对象 (!dso)。从这里您应该能够找到线程试图获取的锁。

澄清:WinDbg 不需要常规安装。只需复制文件。此外,如果您采用挂起转储,则可以根据需要在另一台机器上继续调试。

添加:Sosex具有 !dlk 命令,可在许多情况下自动识别死锁。它不会一直工作,但当它工作时,它会为您完成所有工作,因此这应该是您的首选。

关于c# - 检测 C# 应用程序中的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/508398/

相关文章:

javascript - 在模型上使用 beforeCreate 和 findOrCreate 导致 Sequelize 发生死锁

c# - 解析值行 1,位置 1 时遇到意外字符

c# - 连接到电脑上的蓝牙耳机

Python多线程和HTTP请求

java - 对于垃圾收集来说,如果我们将对象设为 null 并在方法结束时使用后清除收集,这是个好主意

c++ - 线程构建 block : Deadlocks because all threads used up

c# - 发送照片电报 API

c# - 使变量的值 A = B unity

c - 下面的代码可能会出现什么问题?

go - 这种模式如何导致死锁?