幾個C 記憶體洩漏和越界檢測工具簡介

2021-09-23 23:19:19 字數 2601 閱讀 8788

一、boundschecker

boundschecker是乙個執行時錯誤檢測工具,它主要定位程式執行時期發生的各種錯誤。它通過駐留在visual c++開發環境內部的自動處理除錯程式來加速應用程式的開發,縮短產品發布時間。boundschecker對於程式設計中的錯誤(大多數是c++中特有的)提供了清晰的詳細的分析。它能夠檢測和診斷出在靜態,堆疊記憶體中的錯誤以及記憶體和資源洩漏問題。在執行狀態下boundschecker驗證超過8700apis和ole方法,包括最新的windows apis,odbc,activex,directx,com和internet apis。

boundschecker採用一種被稱為code injection的技術,來截獲分配記憶體和釋放記憶體函式的呼叫。簡單的說,當你的程式開始執行時,boundschecker的dll被自動載入程序的位址空間,然後它會修改程序中分配和釋放記憶體的函式的呼叫,讓這些呼叫首先轉入它的**。boundschecker在做這些動作時,無需修改被除錯程式的源**或工程配置檔案,這使得它使用非常的簡便、直接。

程式設計師在開發過程中可能會經常遇到這樣的問題:除錯時語法沒有問題,**也沒有錯誤,但程式執行就是不正常甚至宕機,其實這有可能是邏輯錯誤引起的記憶體溢位或資源洩露等問題。這些錯誤一般是不容易檢測出來的。而這些錯誤就是boundschecker錯誤檢測之一。

通過對被測程式的操作,boundschecker提供詳細的,清晰的錯誤分析;自動查明靜態的堆疊錯誤及記憶體、資源洩漏,並且能夠迅速定位出錯的源**,即使在沒有源**的情況下也能檢查第三方元件的錯誤。

boundschecker能檢測的錯誤包括:

(1)指標操作和記憶體、資源洩漏錯誤

比如:記憶體洩露;資源洩漏;對指標的錯誤操作。

(2)記憶體操作方面的錯誤

比如:記憶體讀、寫溢位;使用為初始化的記憶體。

(3)api函式使用錯誤

二、valgrind

valgrind是一款守gnu通用公共許可證條款的自由軟體,主要用於記憶體除錯、記憶體洩漏檢測以及效能分析。valgrind這個名字取自北歐神話中英靈殿的入口。最初作者是julian seward,他於2023年由於在開發valgrind上的工作獲得了第二屆google-o'reilly開源**獎。

目前的3.7.0版支援x86/linux, amd64/linux, arm/linux, ppc32/linux, ppc64/linux, s390x/linux, arm/android (2.3.x), x86/darwin and amd64/darwin (mac os x 10.6 and 10.7)等作業系統。

valgrind工具包包含多個工具:

1. memcheck 工具主要檢查下面的程式錯誤: 

使用未初始化的記憶體 (use of uninitialised memory) 

使用已經釋放了的記憶體 (reading/writing memory after it has been free』d) 

使用超過 malloc分配的記憶體空間(reading/writing off the end of malloc』d blocks) 

申請的空間是否有釋放 (memory leaks – where pointers to malloc』d blocks are lost forever) 

malloc/free/new/delete申請和釋放記憶體的匹配(mismatched use of malloc/new/new vs free/delete/delete ) 

2. callgrind 

callgrind收集程式執行時的一些資料,函式呼叫關係等資訊,還可以有選擇地進行cache 模擬。在執行結束時,它會把分析資料寫入乙個檔案。callgrind_annotate可以把這個檔案的內容轉化成可讀的形式。 

3. cachegrind 

它模擬 cpu中的一級快取i1,d1和l2二級快取,能夠精確地指出程式中 cache的丟失和命中。如果需要,它還能夠為我們提供cache丟失次數,記憶體引用次數,以及每行**,每個函式,每個模組,整個程式產生的指令數。這對優化程式有很大的幫助。 

4. helgrind 

它主要用來檢查多執行緒程式**現的競爭問題。helgrind 尋找記憶體中被多個執行緒訪問,而又沒有一貫加鎖的區域,這些區域往往是執行緒之間失去同步的地方,而且會導致難以發掘的錯誤。helgrind實現了名為」 eraser」 的競爭檢測演算法,並做了進一步改進,減少了報告錯誤的次數。 

5. massif 

堆疊分析器,它能測量程式在堆疊中使用了多少記憶體,告訴我們堆塊,堆管理塊和棧的大小。massif能幫助我們減少記憶體的使用,在帶有虛擬記憶體的現代系統中,它還能夠加速我們程式的執行,減少程式停留在交換區中的機率。 

三、gflags 和 pageheap

微軟提供的一套工具,在此不過多解釋了,收集幾個文件位置,供參考。

1. msdn gflags工具相關主題

2. 如何在 windows xp 和 windows 2000 中使用 pageheap.exe

(微軟幫助和支援文章編號:286470)

3. 如何使用 pageheap 實用程式來檢測 microsoft visual c + + 專案中的記憶體錯誤

(微軟幫助和支援文章編號:264471)

4. csdn rj20092010 文章:

**mfc記憶體洩露檢測及記憶體越界訪問保護機制

C程式記憶體洩漏檢測工具

第一步 包含以下標頭檔案 define crtdbg map alloc include include 第二步 接管 new 操作符 ifdef debug ifndef dbg new define dbg new new normal block file,line define new db...

qt記憶體洩漏檢測 VLD記憶體洩漏檢測工具

vld記憶體工具可以為每個洩漏的塊提供完整的堆疊跟蹤,包括原始檔和行號資訊,從而快速找到記憶體洩漏點。注 僅支援windows平台。在main.cpp中新增 include後以除錯模式執行即可檢測記憶體洩漏。include int main int argc,char ar main.cpp 5 l...

C 記憶體錯誤檢測工具

簡介 1 開發時,該如何盡力避免記憶體錯誤的發生 2 開發後,該如何去確定真的沒有問題 1 記憶體使用方式簡介 2 使用智慧型指標降低記憶體洩露的風險 3 windows上,使用visual studio做記憶體錯誤檢測 4 linux上,使用valgrind做記憶體錯誤檢測 問題引出 昨天遇到了乙...