正在寻找一个类似于CheckThread for java的.NET并发静态代码分析工具



我正在c#中实现一个并发的.NET数据结构(如ConcurrentDictionaryBlockcingCollection等)。这不仅仅是为了在从不同线程访问时不要忘记锁定对象。它需要复杂的锁定策略来最大限度地延长并行执行时间。

我知道有一个工具,一种用于.NET系统并发测试的框架,名为CHESS。

问题:是否还有一种工具可以通过静态代码分析发现并发/线程问题?类似于适用于java的CheckThread。

以下是一组有助于并行编程的资源。。。它们是静态工具和基于运行时的工具的混合体。

英特尔Inspector XE/并行工作室

英特尔在Parallel Studio中提供了一些有助于并行开发的工具,但他们的Parallel Advisor仅适用于C/C++。

但对于C#,您可以使用Inspector XE(以前的"英特尔线程检测器")进行运行时线程检查

  • http://software.intel.com/en-us/articles/intel-inspector-xe/.

PRESharp(微软软件卓越中心)

这里似乎提到了一种名为PRESharp的东西:

  • http://www.microsoft.com/windows/cse/pa_projects.mspx

现在我以前没听说过。。。只有我过去用来静态分析一些C驱动程序代码的听起来类似的PREFast。我怀疑这是微软的内部工具,除非你有特殊权限,否则其他人无法使用。


静态分析工具

此处列出了大量静态分析工具(例如FXCop)。

  • 哪些静态分析工具可用于C#

和这里提到的Typemock Racer:

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

值得注意的是Coverity Prevent,它声称通过静态分析C/C++、Java或C#代码来检测并发缺陷(NASA评级)。

  • http://www.verifysoft.com/en_coverity_prevent_concurrency.html

  • http://www.theregister.co.uk/2012/08/22/mars_rover_software_coverity/)


WinDBG+SOSEX

其他有助于并行编程的工具还有WinDBG(Windows调试工具的一部分,分布在Windows SDK中),它比Visual Studio调试器更强大。

  • http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx

注意:如果在系统中安装Windows驱动程序工具包8,您现在可以从Visual Studio 2012中使用功能更强大的用户模式调试器,该调试器与WinDBG具有同等功能。

  • http://msdn.microsoft.com/en-us/library/windows/hardware/gg487428.aspx

  • http://blogs.msdn.com/b/mariohewardt/archive/2012/06/05/visual-studio-2012-and-windbg-integration.aspx

您还可以将插件扩展到WinDBG,例如SOSEX插件添加了!dlk命令,该命令可以帮助确定死锁的原因。

  • http://stevestechspot.com/

  • http://blog.scriptico.com/04/debugging-with-windbg-deadlocks-in-applications/

  • 使用Windbg';调试死锁;sclrstack命令

  • http://blogs.msdn.com/b/tess/archive/2008/02/11/hang-caused-by-gc-xml-deadlock.aspx


并发可视化工具(在Visual Studio 2010+中)

Visual Studio中有并发可视化工具,还有一个与之配套的SDK

  • http://msdn.microsoft.com/en-us/library/dd537632.aspx

  • http://blogs.msdn.com/b/visualizeparallel/archive/2011/10/17/introducing-the-concurrency-visualizer-sdk.aspx

  • http://msdn.microsoft.com/en-us/magazine/ee336027.aspx

  • http://msdn.microsoft.com/en-us/magazine/ee410778.aspx


通用并行程序设计注意事项

  • http://msdn.microsoft.com/en-us/magazine/cc817398.aspx

  • http://msdn.microsoft.com/en-us/library/ff963553.aspx

  • http://msdn.microsoft.com/en-us/magazine/cc872852.aspx

  • http://msdn.microsoft.com/en-us/magazine/cc163744.aspx

  • http://www.packtpub.com/beginners-guide-for-C-sharp-2008-and-2005-threaded-programming/book


视频资源

下面是一系列精彩的视频,为您提供调试.NET应用程序的一般建议:

  • http://channel9.msdn.com/Series/-NET-Debugging-Stater-Kit-for-the-Production-Environment/Diagnosing-Application-Issues-01

我应该添加:


基于模型的验证

该技术使用应用程序线程基元的正式模型,并试图断言或反驳该模型具有您想要的属性,例如免于死锁。

可以用形式语言(如Promela)编写模型,然后使用模型检查器(如Spin)证明模型的属性。

  • 正在验证重新进入的读卡器写入程序。Bernard van Gastel。

  • 回归读者作家——模型检验与定理证明相结合的案例研究——ICIS技术报告R08005。Bernard van Gastel、Leonard Lensink、Sjaak Smetsers和Marko van Eeklen。

最新更新