閱讀426 返回首頁    go 汽車大全


幾個C++內存泄漏和越界檢測工具簡介

一、BoundsChecker
    或許你還不知道大名頂頂的Nu-Mega,但一定聽說過他們的產品SoftICE,BoundsChecker也是這家公司的產品。與Visual C++配合使用,據說威力強大。本人和沒有實際用過,在此複製一下百度百科的簡介,好有個簡單的認識。
    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,他於2006年由於在開發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) 
          對堆棧的非法訪問 (Reading/writing inappropriate areas on the stack) 
          申請的空間是否有釋放 (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 []) 
          src和dst的重疊(Overlapping src and dst pointers in memcpy() and related functions) 
    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內存泄露檢測及內存越界訪問保護機製 

最後更新:2017-04-01 13:44:32

  上一篇:go PostgreSQL 行列轉換的用法
  下一篇:go 前端性能優化(三)——傳統 JavaScript 優化的誤區