Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#/.NET分析工具,用于查找竞争条件/死锁_C#_.net_Multithreading_Static Analysis_Ndepend - Fatal编程技术网

C#/.NET分析工具,用于查找竞争条件/死锁

C#/.NET分析工具,用于查找竞争条件/死锁,c#,.net,multithreading,static-analysis,ndepend,C#,.net,Multithreading,Static Analysis,Ndepend,有没有一个工具可以分析.NET代码并找到竞争条件 我有一段代码,它有一个公共静态属性,可以获取或创建一个私有静态字段。它还有一个公共静态方法,将此字段设置为null(…是的,我知道!) 由于这两种方法周围都没有锁,所以可以肯定的是,将来事情会变得非常糟糕。我需要一个工具,它将递归地遍历调用这两个方法中的任何一个,并查看是否有任何东西是在另一个线程上产生的 我正在寻找一个工具或一个独立的SQL脚本(如果可能的话)。您可能想签出。您可能正在寻找以下其中一个: 注意:这个答案来自2010年。

有没有一个工具可以分析.NET代码并找到竞争条件

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

由于这两种方法周围都没有锁,所以可以肯定的是,将来事情会变得非常糟糕。我需要一个工具,它将递归地遍历调用这两个方法中的任何一个,并查看是否有任何东西是在另一个线程上产生的


我正在寻找一个工具或一个独立的SQL脚本(如果可能的话)。

您可能想签出。

您可能正在寻找以下其中一个:


注意:这个答案来自2010年。与所有建议答案一样,建议往往会随着时间的推移而变化。现在可能还有其他产品,CHESS是微软研究实验室的一个项目,它可能已经演变成最终产品,或者被完全废弃。请恕我直言,现在就对哪些产品适合进行新的研究。

将在运行时(不是静态地)进行研究,但可能值得一看。

您看过吗?我不确定它是否能满足您的所有需求,但它是一个很好的产品:

  • 在几分钟内发现性能瓶颈
  • 优化.NET应用程序性能
  • 通过行级计时向下钻取以减慢代码行
  • 配置文件aspx、ASP.NET、C#代码和VB.NET应用程序
    • 请参见此处的答案:

      一些静态分析工具可以进行死锁检测


      另外,从微软试试。

      我一直在试验如何轻松地跟踪这些数据。我一直在努力跟踪一些死锁,特别是在使用许多不同锁语句的场景中

      我的目标是在死锁发生之前检测它们,例如,如果您有两个资源,您知道必须始终以相同的顺序使用它们,否则可能会发生死锁

      。。。应用程序中的其他地方

      lock (lockObj2) 
      lock (lockObj1) // <- I expect some "possible deadlock" detection here 
      { 
          // some code
      } 
      
      锁(lockObj2)
      
      lock(lockObj1)//谢谢拉西,我听说过国际象棋,但没听说过TypeMock Racer。我真的在寻找一个对代码进行静态分析的工具。我使用的是ReSharper 5,它有一个很好的特性,可以检查代码,显示特定方法的所有调用方,并递归地深入研究它们。我需要的是将方法标记为在工作线程上实例化的东西。我将对CQL方法进行更多研究,因为我知道有一个上游调用方脚本,所以我确信有一种方法可以确定是否有任何方法是线程调用的结果。这似乎是最新的并且有效。很好。运行时分析远远优于并发问题的静态分析。静态分析器的运行时约定太多,无法产生良好的信噪比。看起来Jinx就是toast。Wikipedia:Jinx是一个并发调试器,它决定性地控制处理器核心之间的工作负载交错,重点是共享内存交互。使用这种确定性方法,Jinx旨在增加难以捉摸的共享内存错误(有时称为Heisenbug)的发生频率。Jinx不再可用。开发Jinx的Corensic公司被F5 Networks收购,Jinx项目被取消。这是一个非常有趣的想法。受你代码的启发,我写了一些类似的东西,给每个锁分配一个“优先级编号”,然后检查每当我得到多个锁时,我是否按“优先级顺序”得到它们。果不其然,这立即表明,在我的程序中有一个地方,我打破了自己关于锁获取顺序的规则,并修复了我的死锁漏洞。这看起来更简单,但也很有效!你能在GitHub上分享吗?如果你没有,别忘了投票。谢谢
      lock (lockObj2) 
      lock (lockObj1) // <- I expect some "possible deadlock" detection here 
      { 
          // some code
      }