默认情况下,.NET 对死锁检测没有任何的支持。一种常用的方法是通过加载调试器来逐个检测所有的线程来判断是否产生了死锁。现在,图形化调试工具 HawkEye 的创造者 Corneliu 为我们提供了一个选择。他的 ACorns.Debugging 工具,可以在无须重新编译.NET 程序的情况下对大部分死锁进行检测。对此,Corneliu 是这样描述的:
- 这一工具不要求任何形式的重新编译,无论是哪种方式的外部依赖、对外部库的引用,都无须进行代码修改,也不受到在编码时使用指定类型的锁的影响
- 对于没有 PDB 文件的 Release 版本它也能照常工作
- 它可以分析正在运行的进程,也可分析运行之后获取的内存镜像
- 它可以检测涉及多线程的死锁,并返回详细的调用栈和锁的使用信息
- 它只能检测到那些正在激活状态下等待被其它线程占用的锁而形成的死锁
- 它无法检测到“哲学家就餐问题”这样的死锁,或由于定时等待+苏醒 / 检测+锁混合造成的死锁
- 它依赖于一个第三方的 CDB.exe(此文件在微软提供的 Windows 版免费调试工具包中)
- 它完全无须安装,使用一个 xcopy 命令进行布署
- 最最重要的一点——它是免费的(它的源码很快也将发布)
对于那些刚开始接触并行编程的人,Corneliu 提供了一个对死锁的简要介绍,以及对该程序输出结果的说明。
ACorns.Debugging.FindDeadlock.1.0.1.zip 是基于微软的 Debugging Tools for Windows 来工作的。
查看英文原文: Deadlock Debugging for .NET
评论