fxcop使用DataFlowRules規(guī)則集
最近公司某項(xiàng)目布署到生產(chǎn)環(huán)境后,發(fā)現(xiàn)其內(nèi)存占用整體上只升不降,疑遭內(nèi)存泄漏,對(duì)程序的穩(wěn)定運(yùn)行帶來了極大的風(fēng)險(xiǎn)。
解決內(nèi)存泄漏一般有兩種思路:靜態(tài)檢查與動(dòng)態(tài)監(jiān)控。在使用難度上動(dòng)態(tài)監(jiān)控遠(yuǎn)遠(yuǎn)大于靜態(tài)檢查,在使用順序上一般也是先靜后動(dòng)。靜態(tài)檢查一個(gè)比較好的工具就是fxcop。
fxcop是微軟出的一款靜態(tài)代碼檢查工具,從1.36開始被VS集成,其獨(dú)立版本與VS版本的對(duì)應(yīng)關(guān)系是:1.35對(duì)應(yīng)VS2005,1.36對(duì)應(yīng)VS2008,10對(duì)應(yīng)VS2010。獨(dú)立版本有UI與命令行兩種使用方式,集成版本UI被VS集成,只有命令行可獨(dú)立使用。
靜態(tài)代碼檢查工具本質(zhì)上是使用代碼檢查規(guī)則完成對(duì)代碼的檢查,fxcop也是如此。fxcop每個(gè)版本所包括的規(guī)則都略有不同,vs10集成版新增了一個(gè)DataFlowRules規(guī)則集,里面包括一條CA2000,Dispose objects before losing scope規(guī)則,在退出作用域前釋放可釋放的對(duì)象,而這也就是今天的主角。
軟件與規(guī)則集之間并不是隨意組合的。默認(rèn)情況下某一版本的fxcop使用其自帶的規(guī)則。但是今天的情況有所不同,項(xiàng)目是08的,不方便轉(zhuǎn)成10版卻想使用10版的規(guī)則,且這個(gè)規(guī)則集無法被任何獨(dú)立版本的fxcop UI識(shí)別。在網(wǎng)上查了查,說是通過命今行可以識(shí)別,自己又嘗試了好久,終于成功,現(xiàn)在步驟記錄如下,使用的版本為vs10集成版。
1.下載fxcop 10。官網(wǎng)上無獨(dú)立的安裝包,其被集成到windows sdk 里了,可以上Csdn上找網(wǎng)友上傳的單獨(dú)安裝包下載。
2.安裝Fxcop 10,運(yùn)行,加入想要驗(yàn)證的dll,暫時(shí)選中任1條規(guī)則,分析。這樣做的目的是可以跟據(jù)提示補(bǔ)齊檢查所需的各種dll,其路徑會(huì)被記錄到Fxcop項(xiàng)目文件中。如果直接使用命令行,如果缺失dll則無任何提示,可能會(huì)報(bào)錯(cuò)終止分析,也可能能正常運(yùn)行但檢查不出我想要的結(jié)果。補(bǔ)充dll時(shí)注意dll版本號(hào)。新舊dll可能不能相互替代。
3.補(bǔ)齊所有dll后,把所有默認(rèn)規(guī)則都取消,保存fxcop項(xiàng)目文件。一般來講只能保存到被檢查的dll的同級(jí)目錄。
4.用記事本打開上一步保存的后綴名為fxcop的fxcop項(xiàng)目文件。這是一個(gè)xml格式的文件。在RuleFiles節(jié)加入上面提到的規(guī)則:
<RuleFile Name="$(FxCopDir)\Rules\DataflowRules.dll" Enabled="False" AllRulesEnabled="False" > <Rule Name="Dispose objects before losing scope" Enabled="True" /> </RuleFile>
如果你熟悉這個(gè)文件,就會(huì)發(fā)現(xiàn)他的名字有點(diǎn)怪,其它規(guī)則集的規(guī)則的名稱是單詞大寫開頭且中間沒有空格,而這個(gè)特殊的規(guī)則集的規(guī)則則是首單詞首字母大寫且中間有空格。我只需要這個(gè)規(guī)則,而如果不指定規(guī)則名則會(huì)使用規(guī)則集內(nèi)的所有規(guī)則。由于與其它常規(guī)名字風(fēng)格不同,我找這個(gè)名字找了好久,最后通過VS找到了。打開任一項(xiàng)目,在代碼分析里單選此規(guī)則,然后保存項(xiàng)目文件,則在項(xiàng)目dll的同級(jí)目錄內(nèi)會(huì)生成一個(gè)"dll名.CodeAnalysisLog.xml"文件,里面的Rules/Rule/Name就記錄了選中的規(guī)則的實(shí)際名字。
5.使用Win+R調(diào)出命令窗口,輸入cmd進(jìn)入命令行并定位到“Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop”,然后輸入命令:
fxcopcmd /p:zc.FxCop /o:w:\zc.xml
其中fxcopcmd是命令名,/p指定FxCop項(xiàng)目文件路徑,/o指定結(jié)果輸出路徑。等待一兩分鐘后,命令行停止運(yùn)行并重新出現(xiàn)輸入提示符,就可以去剛才指定的輸出路徑去查看結(jié)果了。
6.結(jié)果文件是一個(gè)純Xml文件,并指定了渲染需要的xslt文件。在C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\Xml目錄內(nèi)有個(gè)FxCopReport.xsl文件,將其考到結(jié)果文件的同級(jí)目錄,然后用記事本打開結(jié)果文件,在第二行將其指定的xslt路徑改為同級(jí)目錄。這樣只要同時(shí)拷貝這兩個(gè)文件就可以隨時(shí)隨地查看了。
以上就是整個(gè)操作過程。用一句話來表達(dá),就是使用fxcop UI生成項(xiàng)目文件,解決Dll依賴,然后手工加入需要的規(guī)則,執(zhí)行命令行得到結(jié)果,將xslt文件拷貝到結(jié)果文件同級(jí)目錄并更改結(jié)果文件的xslt文件指向,就可以隨地查看了。下面還有幾點(diǎn)需要額外注意。
1.不管怎么折騰,獨(dú)立版本的UI始終無法識(shí)別這個(gè)規(guī)則集,VS08集成UI也無法使用。
2.每個(gè)規(guī)則集都對(duì)應(yīng)一個(gè)dll,每個(gè)規(guī)則則對(duì)應(yīng)一個(gè)類。通過反編譯這些dll可以看到,DataFlowRules規(guī)則集繼承的是另外一套類,網(wǎng)上稱為Phoenix engine。要想成功使用它,就需要額外的一套操作類庫,我所知道的有“Microsoft.VisualStudio.CodeAnalysis.DataflowModels.dll”,“Microsoft.VisualStudio.CodeAnalysis.Phoenix.dll”,“Microsoft.VisualStudio.CodeAnalysis.Phoenix.xml”,“phx.dll”,“Runtime-vccrt-win-msil.dll”等。而獨(dú)立的fxcop默認(rèn)是沒有這些dll的,理論上只要補(bǔ)充了這些dll,10獨(dú)立版本的命令行可以使用這個(gè)規(guī)則集。(這個(gè)本人已經(jīng)驗(yàn)證,可以使用)
3.1.35獨(dú)立對(duì)應(yīng).net 2.0,1.36獨(dú)立與vs08集成對(duì)應(yīng).net 3.5,10獨(dú)立與Vs10集成對(duì)應(yīng).net 4.0,這個(gè)規(guī)則集被包括在vs10集成中。由于平臺(tái)版本不一致,即使補(bǔ)充了這些dll,其它版本的命令行可能也無法使用這個(gè)規(guī)則集,包括1.35獨(dú)立,1.36獨(dú)立,vs08集成。
4.一個(gè)表格總結(jié)一下:
| 1.35獨(dú)立 | 1.36獨(dú)立 | vs08集成 | 10獨(dú)立 | vs10集成 | |
| UI | × | × | × | × | √ |
| 命令行 | × | × | × | √ | √ |
參考的文章:

浙公網(wǎng)安備 33010602011771號(hào)