文章目錄
- IDE整合
- #pragma支援
- 批註支援
- 命令列支援
- IDE整合
- MSBuild整合
- Performance Session Wizard
- Performance Explorer
- Summary視圖
- Functions視圖
- Caller/Callee視圖
- Callstack視圖
- Type視圖
- 命令列支援
作者:Kamran Iqbal (Microsoft Corporation)
相關技術:程式碼分析、代碼檢測
難度:★★★☆☆
讀者類型:微軟技術開發人員、程式碼測試人員
[摘要]本文描述Visual Studio 2005 Team System提供的程式碼分析和可用執行工具。
簡介
要開發健壯而可靠的軟體,開發人員需要一套整合分析工具來協助他們在開發的早期檢測代碼缺陷和效能問題。
分析工具支援
過去,由於Visual Studio中缺少對程式碼分析的支援,因此開發人員不得不購買第三方工具,以構建自訂分析工具或者發布未經分析的代碼。
從眾多的分析工具中選擇一個既能滿足軟體分析的要求又在預算限制範圍之內的工具,未必總是一項輕鬆的任務。另外,這些工具可能沒有整合到Visual Studio整合式開發環境(IDE)中,因此通常需要花費額外的時間來學習如何順利地使用它們。
構建自訂分析工具需要資源、技能和經驗。這對大多數公司中的Team Dev而言是不現實的,僅僅是少數公司可以擔負得起的選擇。
在工時期限和預算限制緊張的情況下,發布未經分析的代碼似乎是一種正確的方法,但如果軟體在部署之後發生故障,可能證明採用這種錯誤方法的代價不菲。
解決方案
在Visual Studio 2005 Team System中,開發人員將會看到一套全新的、完全整合到IDE中的分析工具。這種分析工具與開發環境的緊密整合,可以協助開發人員在產品開發的早期檢測並修複代碼缺陷和效能問題。這還可以協助團隊有效並且高效地管理軟體開發生命週期(Software Development Life Cycle,SDLC)。在Visual Studio 2005 Team System中,有兩類分析工具可用於構建健壯而可靠的軟體:
在開發環境中,整合分析工具可以協助開發人員檢測與編碼、效能及安全性相關的問題。此外,可將程式碼分析工具作為簽入原則的一部分用於日常構建過程,使Team Dev能夠在將代碼簽入到原始碼樹(source tree)之前修正缺陷。通過在開發的早期(而不是後期)更正問題,團隊可降低修複代碼缺陷的總體成本。除了完全整合到IDE中之外,開發人員還可以從命令列使用這些工具。
Visual Studio中的工具整合
在Visual Studio 2005 Team System中,通過使用程式碼分析工具和效能工具,開發人員可以對代碼進行靜態和動態分析。
程式碼分析工具
程式碼分析工具的目標是使開發人員能夠對其項目進行靜態分析,以檢測和修複代碼缺陷。為了實現這個目標,Visual Studio 2005 Team System中包含了兩個工具:
PREfast
PREfast是一個靜態分析工具,它為開發人員提供有關其C/C++原始碼中可能存在缺陷的資訊。PREfast報告的常見代碼錯誤包括緩衝區溢位、未初始化記憶體、null 指標取值 (Dereference)、記憶體流失和資源短缺。
IDE整合
為了使開發人員能夠自然地流量分析工具,可以將PREfast完全整合到IDE中。通過在項目的Property Pages上選擇Yes (/prefast),開發人員可以輕鬆啟用PREfast,1所示。
圖1 啟用PREfast
在產生過程中,為原始碼產生的任何PREfast警告都出現在Error List中,這些警告包括缺陷路徑資訊。雙擊反白缺陷路徑的警告,可以進入代碼編輯器中的警告,2所示。
圖2 PREfast警告
#pragma支援
開發人員可以使用#pargma指令來將警告視為錯誤或者禁用警告,如下所示:
#pragma warning (error: 6260) // 將6260號警告視為錯誤
#pragma warning (disable: 6011) // 禁用6011號警告
批註支援
PREfast還支援批註以改善程式碼分析的精確性。批註提供有關函數參數和傳回型別的之前和之後條件的附加資訊。
#include
[SA_Post(MustCheck=SA_Yes)]
double* CalcSquareRoot
(
[SA_Pre(Null=SA_No)] double* source,
unsigned int size
)
在上面的樣本中:
- [SA_Post(MustCheck=SA_Yes)]要求調用方檢查CalcSquareRoot的傳回值。
- [SA_Pre(Null=SA_No)]要求調用方將不允許為 NULL 的參數“source”傳遞給CalcSquareRoot。
命令列支援
除了與開發環境完全整合之外,開發人員還可以從命令列使用PREfast,如下所示。
C:\>cl /prefast Sample.cpp
FxCop
FxCop是一個靜態分析工具,它分析Managed 程式碼程式集並報告有關程式集的資訊。FxCop表示在分析過程中作為規則執行的檢查。規則是一段Managed 程式碼,該程式碼分析程式集並返回有關它發現結果的訊息。規則訊息識別任何相關的編程和設計問題,並在可能的情況下提供有關如何修複目標的資訊。
IDE整合
為了使開發人員能夠自然地流量分析工具,開發人員可以在項目的Property Pages上選擇Run FxCop,3所示。
圖3 啟用FxCop
有關包含或排除規則、將規則作為警告或錯誤的附加選項,也可以在Property Pages中找到,4所示。
圖4 FxCop規則
一旦啟用FxCop,在產生過程中FxCop就會在Error List中報告衝突,5所示。
圖5 FxCop規則衝突
Error List提供有關規則衝突的資訊和建議,以便於您糾正錯誤。只需在Error List中雙擊規則衝突,即可輕鬆地定位到違反了規則的程式碼。
MSBuild整合
Visual Studio的下一個版本從根本上改進了產生過程,其方法是引入一個新的、名為MSBuild的產生引擎。可以通過MSBuild系統調用FxCop。這使開發人員能夠從命令列運行託管項目上的FxCop。
效能工具
在Visual Studio 2005 Team System中,開發人員可以通過效能工具來度量、計算和定位代碼中與效能相關的問題。這些工具都完全整合到IDE中,以提供無縫、友好的使用者體驗。效能工具支援兩種分析方法:
在採樣的過程中,資料收集基礎結構將定期中斷正在執行的應用程式,以確定正在執行的是哪個函數,並增加函數的採樣計數。它儲存有關準備函數調用的呼叫堆疊的資訊。應用程式退出後,收集到的所有資料會產生為一個報告檔案,您可以使用IDE中整合的報告功能輕鬆地查看該檔案。
採樣的優勢在於低開銷,因為這隻是定期中斷應用程式。這使得應用程式的行為能夠更接近實際情況。這種方法的缺點是,它只能擷取已採樣函數的相關效能資料。有可能沒有對需要採樣的函數進行採樣,因而無法擷取有關該函數的資訊。
使用儀器的優勢在於可以收集應用程式的特定部分的精確效能資料。在使用儀器的過程中,“enter”和“exit”探針被插入到應用程式的函數中。這些探針將報告返回給資料收集基礎結構,並允許使用者捕獲函數執行所需的精確時間(或其他衡量標準)。
分析應用程式
分析應用程式的首選使用模式是首先開始採樣,然後根據採樣所產生的結果檢測應用程式的特定方面。
分析應用程式的過程相當簡單。首先建立一個新的效能會話。在Visual Studio 2005 Team System中,可以使用Performance Session Wizard建立一個新的效能會話。
Performance Session Wizard
Performance Session Wizard設定分析應用程式的必要環境。在Visual Studio 2005 Team System中,該嚮導為EXE、DLL和ASP.NET應用程式提供內建支援。可以使用該嚮導建立一個New Performance Session,6所示。
圖6 啟動效能嚮導
註:要手動建立一個新的效能會話,請使用菜單上的New Performance Session命令,可以採用這種方法來手動分析其他類型的應用程式(例如Windows服務)。
Performance Explorer
運行會話嚮導或手動建立會話的結果是建立了一則效能會話。Performance Explorer可以將其直觀地表示出來,7所示。
圖7 效能資源管理員
Performance Explorer給使用者呈現了階層。該階層的根節點表示Performance Session。這種節點的屬性是使用者在建立Performance Session時設定的屬性。如果使用者使用Performance Session Wizard建立會話,則這些屬性體現了使用者在使用嚮導的過程中所選擇的值。如果使用者手動建立Performance Session,則這些屬性包含了它們的預設值。
根節點有兩個子節點:Targets節點和Reports節點。Targets節點包含一個或多個目標,目標可以是EXE、DLL或ASP.NET應用程式。Reports節點包含與某個特定Performance Session相關的所有報告。
效能會話報告
一旦應用程式執行完畢,系統就會將一個效能會話報告自動添加到Reports節點。可以通過下面的視圖來查看這些報告:
Summary視圖
Summary視圖為開發人員提供了其調查的起點。它顯示應用程式執行過程中開銷最高的函數,8所示。從該視圖中的每個資料點,使用者都可以定位到更詳細的視圖。
圖8 Summary視圖
Functions視圖
Functions視圖顯示在應用程式的執行過程中調用的全部函數,這些函數存在於由該應用程式引用的所有模組之中,9所示。該視圖顯示的資訊取決於所用的分析方法(採樣與使用儀器)。
圖9 Functions視圖
Caller/Callee視圖
Caller/Callee視圖提供在Functions視圖中所列函數的詳細資料,10所示。
圖10 Caller/Callee視圖
Callstack視圖
Callstack視圖使使用者能夠向下搜尋特定的調用跟蹤,並分析哪些跟蹤對效能的影響最大。
圖11 Callstack視圖
Type視圖
Type視圖提供有關某個特定類型的執行個體數量和總位元組數的資訊,12所示。
圖12 Type視圖
命令列支援
可以通過命令列工具使用效能工具的功能。這為使用者提供了靈活性,使用者既可以從命令列運行這些工具,又可以通過指令碼來使用它們,以便自動執行任務。
小結
Visual Studio 2005 Team System包含一套新的、完全整合到開發環境中的分析工具,並且可以從命令列使用這套工具。通過提供代碼缺陷和效能瓶頸檢測,這些強大且便於使用的工具可以協助開發人員構建健壯而可靠的軟體。