最近我發現我那個程式洩露嚴重,手動也查不出來。指針亂指。是以剛下了個BoundChecker 6.0 版的 嘿嘿ie
在網上看到了它的用法,感覺還不錯。
BoundsChecker用法
<a href="http://blog.sina.com.cn/u/53d9f7e9010007fz">http://blog.sina.com.cn/u/53d9f7e9010007fz</a>
BoundsChecker
是一個Run-Time錯誤檢測工具,它主要定位程式在運作時期發生的各種錯誤。BoundsChecker能檢測的錯誤包括:
1)
)1、
指針操作和記憶體、資源洩露錯誤,比如:
記憶體洩露;
資源洩露;
對指針變量的錯誤操作。
22、記憶體操作方面的錯誤,比如:
記憶體讀、寫溢出;
使用未初始化的記憶體。
33、API函數使用錯誤
BoundsChecker安裝成功後,在你
的VC++內建開發環境中,會多出了一個名為BoundsChecker的菜單,如下所示:
圖3-1 BoundsChecker在
VC++內建開發環境
中添加的菜單
已經非常完好的內建到VC++內建開發環境中了。
使用
對程式的運作時錯誤進行檢測,有兩種使用模式可供選擇。一種模式叫做ActiveCheck,一種模式叫做FinalCheck
。下面分别進行介紹。
ActiveCheck是
BoundsChecker提供的一種友善、快捷的錯誤檢測模式,它能檢測的錯誤種類有限,隻包括:記憶體洩露錯誤、資源洩露錯誤、API函數使用錯誤。
要想使用ActiveCheck模式來檢測程
序的運作時錯誤,隻需在VC++內建開發環境中打開BoundsChecker功能,然後從調試狀态運作程式即可。此時ActiveCheck會在背景自
動運作,随時檢測程式是否發生了錯誤。下面說一下具體的使用步驟。
使用ActiveCheck的具體的操作步驟
如下:
首先,在VC++內建開發環境中打開你要對其
進行測試
的程式,同時保證項目處于
Debug編譯狀态下。
其次,確定VC++內建開發環境中
[BoundsChecker/Integrated Debugging]菜單項和[BoundsChecker/Report Errors and
Events]菜單項處于被選中的狀态。隻有這兩項被選中,BoundsChecker才會在程式運作過程中發揮作用。
最後,在VC++內建開發環境中選擇
[Build/ Start Debug/Go]菜單指令,在Debug狀态下運作程式,ActiveCheck也在背景開始運作了。
這時,就可以按照制定好的測試用例,對程式進
行操作。凡是程式執行過的代碼,如果存在錯誤,ActiveCheck就會記錄下來。
有一個地方要說一下,在
[BoundsChecker]菜單中有一項[Report Errors Immediately],如下圖所示:
圖3-2 關于
[BoundsChecker / Report Errors
Immediately] 菜單項
該菜單項對于
ActiveCheck
模式,以及下面就要介紹的FinalCheck模式的作用是一樣的,即:如果不選中該項,則BoundsChecker會記錄程式運作過程中發現的各種錯
誤,直到程式結束後再進行報告;當選中該菜單項時,在程式的運作過程中,一旦BoundsChecker發現錯誤,會馬上彈出如下的對話框進行提示:
圖3-3 錯誤報告對話框
下面按圖中标注的數字序号解釋一下對話框中各個按鈕的功能:
按鈕
1:點選
該按鈕,則表示先暫時不理會這個錯誤,繼續執行程式。
按鈕2:
點選
該按鈕,則會馬上跳轉到出現問題的代碼行處。處理完問題後,點選
[Build/ Start Debug/Go]菜單項,
可以繼續執行程式,進行檢測。
按鈕3:
該按鈕,則将該錯誤添加到被忽略的錯誤清單中去,當再次出現這個問題時,
BoundsChecker将不會進行報告。
按鈕4:
該按鈕,則立即終止程式的執行。
按鈕5:
該按鈕,會顯示目前記憶體的申請、使用情況。
按鈕6:
該按鈕,會得到目前這個錯誤的幫助資訊。
按鈕7、8: 這兩個按鈕與[
BoundsChecker/Report
Errors Immediately
]和[
BoundsChecker/ Report Errors and Event
] 菜單指令的功能是完全一樣的,
在此不再贅述。
按鈕9:
該按鈕,會顯示/隐藏與該錯誤有關的函數調用堆棧情況,以及具體的出錯代碼行的位置。
是否選中
[BoundsChecker/Report Errors
Immediately]菜單項,完全取決于你自己的喜好,以及測試時的具體情況。如果你想要
BoundsChecker在程式運作過程中實時向你彙報發現的錯誤,那麼你就選中這個菜單
項;如果想等到操作結束後,再對操作過程中BoundsChecker發現的錯誤統一進行分析,就不必選中這個菜單項。我在平常使用過程中更偏向于使用後
一種。
在你操作全部結束,退出程式後,
會顯示一個所發現錯誤的清單。我們需要對清單中羅列的錯誤進行分析,來确定錯誤的原因和位置。
在錯誤檢測結果清單中,羅列出了在程式的執行過程中ActiveCheck檢測到的所有的記憶體洩露、資源洩露和API函數使用錯誤的相關信
息。如下圖所示:
圖3-4 錯誤檢測結果
在左邊的視窗中,逐條列出了程式在記憶體、資
源、API
函數使用上的問題,包括:該問題的種類,該問題發生的次數,如果是記憶體洩露,損失了多少記憶體,以及發生該問題的代碼位置等等。當你用滑鼠單擊選中某一條記
錄時,在右邊的視窗中會顯示出與該條錯誤記錄相對應的函數調用堆棧情況。當你用滑鼠輕按兩下某一條錯誤記錄時,會定位到引發該錯誤的源代碼處。
好了,BoundsChecker在ActiveCheck模式下的使用方法至此介紹完了,是不是很
簡單?
在ActiveCheck模式下檢測程式時,程式的運作速度基本不受影響,但其缺點是檢測的
錯誤種類有限,即隻能檢查出
記憶體洩露錯誤、資源洩露錯誤、API
函數使用錯誤。
提供了另外一種檢測錯誤的模式—— FinalCheck,也就是我們在前面提到的BoundsChecker的第二種使用模式。
FinalCheck可以檢測出程式中更多的錯誤。下面我們就對它進行介紹。
FinalCheck具有
BoundsChecker提供的所有檢錯功能。
FinalCheck
是ActiveCheck的超集,它除了能夠檢測出ActiveCheck能夠檢測出的錯誤,還能發現很多 ActiveCheck
不能檢測到的錯誤,包括:
指針操作錯誤、記憶體操作溢出、使用未初
始化的記憶體等等,并且,對于
ActiveCheck能檢測出的錯
誤,FinalCheck能夠給出關于錯誤更詳細的資訊。是以,我們可以把FinalCheck認為是ActiveCheck的功能增強版。我們付出的代
價是:程式的運作速度會變慢,有時甚至會變的很慢。
要想在FinalCheck
模式下測試程式,不能使用VC++內建開發環境提供的編譯連接配接器來構造程式,而必須要使用BoundsChecker提供的編譯連接配接器來編譯連接配接程式。當
BoundsChecker的編譯連接配接器編譯連接配接程式時,會向程式中插裝一些錯誤檢測代碼,這也就是FinalCheck能夠比ActiveCheck找
到更多錯誤的原因。
下面就
介紹一下如何在FinalCheck模式下對
程式進行測試:
1在VC++內建開發環境中打開你所要測試的
項目。
2由于要使用BoundsChecker的編
譯連接配接器重新編譯連接配接程式,是以我們為BoundsChecker獨自構造一個檔案夾。在VC++內建開發環境中,具體操作方法是:
A)點選[
Build/Configurations...]菜單指令。
B)在彈出的對話框中點選 Add 按鈕。在Configuration
編輯框中添入你為BoundsChecker建立的檔案夾的名稱,這個名稱是任意的,比如我們取名為BoundChecker。
C)在
Copy settings from組合框中選中
XXX—Win32
Debug項
,然後點選OK按鈕,接着點選
Close按鈕。
現在,我們已經為FinalCheck構造好
了一個檔案夾。
3 點選[Build/Set Active
Configuration…]
菜單指令,選中你剛才為BoundsChecker建的檔案夾,然後點選OK按鈕。這樣BoundsChecker編譯連接配接程式時生成的中間檔案、可執行
程式,都會被放到該檔案夾下。
4選擇
[BoundsChecker/Rebuild All with BoundsChecker]
菜單指令,對程式重新進行編譯連接配接,也就是在這時,BoundsChecker向被測程式的代碼中加入了錯誤檢測碼。編譯連接配接完成
後,BoundsChecker會在你為BoundsChecker構造的檔案夾中生成可執行檔案。
在FinalCheck模式下對程式進行檢測的準備工作都已經做好,這時可以啟動程式開始測
試了,
操作步驟與在
ActiveChecker模式下沒什麼差別。具體
步驟如下:
確定VC++內建開發環境中[BoundsChecker/ Integrated
Debugging]菜單項和[BoundsChecker/Report Errors and Events]菜單項處于選中狀态。
[ Build/Start
Debug]菜單,選中“Go” 菜單項。程式開始在Debug狀态下運作。
按照你制定好的測試用例,對程式進行操作。
當
BoundsChecker檢測到了錯誤
時,會彈出視窗向你彙報,你可以當時就進行處理,也可以等到你的操作全部完成,退出程式之後再對列出的這些錯誤進行分析。這完全取決于你是否選中了
[BoundsChecker/Report Errors Immediately]
菜單項。
退出程式後,
會給出錯誤檢測結果清單。該錯誤清單與ActiveChecker給出的錯誤清單的檢視方
法完全一樣。隻不過這個清單中所報告的資訊會更多、更詳細一些。
好了,
BoundsChecker在
模式下的使用也介紹完了。
ActiveChecker、
FinalCheck這兩種模式,比較而言各有長短。
ActiveChecker使用友善,隻需在Debug狀态下直接運作程式即可,并且程式的
運作速度較快,但檢測的錯誤種類有限;
FinalCheck模式
下,需要使用
BoundsChecker的編譯連接配接器重新編譯連
接生成可執行程式,并且程式的運作速度比較慢,但檢測的錯誤種類、提供的錯誤相關資訊要多于ActiveChecker。是以,何時使用何種模式,應根據
當時的具體情況而定。