C#/.NET分析工具,用于查找竞态条件/死锁问题。

42

有没有一种工具可以分析.NET代码并找到竞态条件?

我有一些代码,其中有一个公共的静态属性来获取或创建私有的静态字段。它还有一个公共的静态方法将此字段设置为null(...是的,我知道!..)

由于这些方法都没有锁定,所以很可能在未来出现严重问题。我需要一种工具,可以递归地遍历调用这些方法的内容,并查看是否在另一个线程上生成了任何东西。

我正在寻找一种工具或者也许是nDepend SQL脚本(如果可能的话)。

6个回答

20

你可能在寻找下列其中一个内容:


注意:此回答为2010年的回答,就像所有推荐答案一样,随着时间的推移,推荐可能会发生变化。现在可能已经有其他产品了,Microsoft Research Labs的项目CHESS可能已经发展成为最终产品或被取消。请谨慎考虑此答案,并进行新的研究,以确定哪些产品适合当前情况。


谢谢Lasse, 我听说过CHESS,但没有听说过TypeMock Racer。 我真的正在寻找一种对代码进行静态分析的工具。 我正在使用ReSharper 5,它有一个很好的功能,可以检查代码并显示特定方法的所有调用者,并递归地通过它们钻取。 我需要的是将某个方法标记为在线程上下文中实例化的东西。 我将更多地研究CQL方法,因为我知道有一个上游调用脚本,所以我确定有一种方法可以找出哪些方法是线程调用调用的结果。 - Steve Dunn
1
这个 chess 的 fork 看起来是最新的并且可以正常工作。 - zejuel

4
我一直在尝试找到一种简单的方法来跟踪这些情况。我一直在努力跟踪一些死锁,特别是在使用多个不同锁语句的场景下。
我的目标是在发生死锁之前检测到它们,例如,如果您有两个资源,您知道必须始终按相同的顺序使用它们,否则可能会发生死锁。
lock (lockObj1) 
lock (lockObj2) 
{ 
    // some code
} 

... somewhere else in the app ...

lock (lockObj2) 
lock (lockObj1) // <- I expect some "possible deadlock" detection here 
{ 
    // some code
} 

在这种情况下,我在一个地方使用了lockObj1,然后使用它们的相反顺序在另一个地方使用,这是您想避免在应用程序中发生的事情。
当然,不需要像示例中那样一次使用多个lock语句。您复杂的应用程序可能有几个复杂对象彼此交互。
我已经上传了带有测试用例的代码,请点击https://github.com/glmnet/LockTracer查看。

2
这是一个非常有趣的想法。受到你的代码启发,我写了类似的东西,为每个锁分配了一个“优先级号码”,然后检查每当我获得多个锁时,我是否按照“优先顺序”获取它们。果然,这立即揭示了我的程序中有一个地方我违反了自己关于锁获取顺序的规则,修复了这个问题,也解决了死锁漏洞。 - RenniePet
1
看起来更简单,但很有效!你能在GitHub上分享一下吗?如果还没有点赞,请不要忘记。谢谢! - Guillermo Ruffino

4

Jinx会在运行时而不是静态时做这个操作,但这可能值得一看。


很好。运行时分析比静态分析并发问题要优秀得多。静态分析器产生的信噪比太低,因为有太多的运行时约定。 - Michael Donohue
看起来Jinx已经完蛋了。 - tofutim
1
维基百科:Jinx是一个并发调试器,可以确定地控制处理器核心之间的工作负载交错,重点关注共享内存交互。使用这种确定性方法,Jinx旨在增加难以捉摸的共享内存错误(有时称为Heisenbugs)的出现频率。 Jinx已不再可用。正在开发Jinx的Corensic公司被F5 Networks收购,Jinx项目被取消。 - tofutim

3

You might want to check out CHESS.


2

0

你看过Red-Gate Ants吗?我不确定它是否能满足你的所有需求,但它是一个很好的产品,可以:

  • 在几分钟内识别性能瓶颈
  • 优化.NET应用程序性能
  • 通过行级时间轴深入到慢代码
  • 对aspx、ASP.NET、C#代码和VB.NET应用程序进行分析

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接