fxcop使用DataFlowRules规则集

      最近公司某项目布署到生产环境后,发现其内存占用整体上只升不降,疑遭内存泄漏,对程序的稳定运行带来了极大的风险。

      解决内存泄漏一般有两种思路:静态检查与动态监控。在使用难度上动态监控远远大于静态检查,在使用顺序上一般也是先静后动。静态检查一个比较好的工具就是fxcop。

      fxcop是微软出的一款静态代码检查工具,从1.36开始被VS集成,其独立版本与VS版本的对应关系是:1.35对应VS2005,1.36对应VS2008,10对应VS2010。独立版本有UI与命令行两种使用方式,集成版本UI被VS集成,只有命令行可独立使用。

      静态代码检查工具本质上是使用代码检查规则完成对代码的检查,fxcop也是如此。fxcop每个版本所包括的规则都略有不同,vs10集成版新增了一个DataFlowRules规则集,里面包括一条CA2000,Dispose objects before losing scope规则,在退出作用域前释放可释放的对象,而这也就是今天的主角。

      软件与规则集之间并不是随意组合的。默认情况下某一版本的fxcop使用其自带的规则。但是今天的情况有所不同,项目是08的,不方便转成10版却想使用10版的规则,且这个规则集无法被任何独立版本的fxcop UI识别。在网上查了查,说是通过命今行可以识别,自己又尝试了好久,终于成功,现在步骤记录如下,使用的版本为vs10集成版。

      1.下载fxcop 10。官网上无独立的安装包,其被集成到windows sdk 里了,可以上Csdn上找网友上传的单独安装包下载。

      2.安装Fxcop 10,运行,加入想要验证的dll,暂时选中任1条规则,分析。这样做的目的是可以跟据提示补齐检查所需的各种dll,其路径会被记录到Fxcop项目文件中。如果直接使用命令行,如果缺失dll则无任何提示,可能会报错终止分析,也可能能正常运行但检查不出我想要的结果。补充dll时注意dll版本号。新旧dll可能不能相互替代。

      3.补齐所有dll后,把所有默认规则都取消,保存fxcop项目文件。一般来讲只能保存到被检查的dll的同级目录。

      4.用记事本打开上一步保存的后缀名为fxcop的fxcop项目文件。这是一个xml格式的文件。在RuleFiles节加入上面提到的规则:

<RuleFile Name="$(FxCopDir)\Rules\DataflowRules.dll" Enabled="False" AllRulesEnabled="False" >
    <Rule Name="Dispose objects before losing scope" Enabled="True" />
</RuleFile>

      如果你熟悉这个文件,就会发现他的名字有点怪,其它规则集的规则的名称是单词大写开头且中间没有空格,而这个特殊的规则集的规则则是首单词首字母大写且中间有空格。我只需要这个规则,而如果不指定规则名则会使用规则集内的所有规则。由于与其它常规名字风格不同,我找这个名字找了好久,最后通过VS找到了。打开任一项目,在代码分析里单选此规则,然后保存项目文件,则在项目dll的同级目录内会生成一个"dll名.CodeAnalysisLog.xml"文件,里面的Rules/Rule/Name就记录了选中的规则的实际名字。

      5.使用Win+R调出命令窗口,输入cmd进入命令行并定位到“Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop”,然后输入命令:

fxcopcmd /p:zc.FxCop /o:w:\zc.xml

      其中fxcopcmd是命令名,/p指定FxCop项目文件路径,/o指定结果输出路径。等待一两分钟后,命令行停止运行并重新出现输入提示符,就可以去刚才指定的输出路径去查看结果了。

      6.结果文件是一个纯Xml文件,并指定了渲染需要的xslt文件。在C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\Xml目录内有个FxCopReport.xsl文件,将其考到结果文件的同级目录,然后用记事本打开结果文件,在第二行将其指定的xslt路径改为同级目录。这样只要同时拷贝这两个文件就可以随时随地查看了。

      以上就是整个操作过程。用一句话来表达,就是使用fxcop UI生成项目文件,解决Dll依赖,然后手工加入需要的规则,执行命令行得到结果,将xslt文件拷贝到结果文件同级目录并更改结果文件的xslt文件指向,就可以随地查看了。下面还有几点需要额外注意。

      1.不管怎么折腾,独立版本的UI始终无法识别这个规则集,VS08集成UI也无法使用。

      2.每个规则集都对应一个dll,每个规则则对应一个类。通过反编译这些dll可以看到,DataFlowRules规则集继承的是另外一套类,网上称为Phoenix engine。要想成功使用它,就需要额外的一套操作类库,我所知道的有“Microsoft.VisualStudio.CodeAnalysis.DataflowModels.dll”,“Microsoft.VisualStudio.CodeAnalysis.Phoenix.dll”,“Microsoft.VisualStudio.CodeAnalysis.Phoenix.xml”,“phx.dll”,“Runtime-vccrt-win-msil.dll”等。而独立的fxcop默认是没有这些dll的,理论上只要补充了这些dll,10独立版本的命令行可以使用这个规则集。(这个本人已经验证,可以使用)

      3.1.35独立对应.net 2.0,1.36独立与vs08集成对应.net 3.5,10独立与Vs10集成对应.net 4.0,这个规则集被包括在vs10集成中。由于平台版本不一致,即使补充了这些dll,其它版本的命令行可能也无法使用这个规则集,包括1.35独立,1.36独立,vs08集成。

      4.一个表格总结一下:

  1.35独立 1.36独立 vs08集成 10独立 vs10集成
UI × × × ×
命令行 × × ×

      参考的文章:

      FxCop 使用Data Flow Rules

      Is there a FxCop rule for local used IDisposable's?

原文地址:https://www.cnblogs.com/ljzforever/p/2721583.html