1. 程式人生 > >C/C++內存檢測工具Valgrind

C/C++內存檢測工具Valgrind

調用 memcpy ubunt href malloc 函數調用 -c strong 內存泄漏

內存檢測Valgrind簡介

Valgrind是運行在Linux上一套基於仿真技術的程序調試和分析工具,作者是獲得過Google-O‘Reilly開源大獎的Julian Seward,

包含一個內核──一個軟件合成的CPU,和一系列的小工具,每個工具都可以完成一項任務──調試,分析,或測試等,內存檢測,

我們可以使用它的工具:Memcheck。

Valgrind 安裝

方法 1. valgrind官網:http://valgrind.org下載

方法 2. Ubuntu sudo apt-get install valgrind

Memcheck檢測範圍:

用來檢測c/c++程序中出現的內存問題,所有對內存的讀寫都會被檢測到,一切對malloc()/free()/new/delete的調用都會被捕獲。

所以,它能檢測以下問題:


1) 對未初始化內存的使用;


2) 讀/寫釋放後的內存塊;


3) 讀/寫超出malloc等分配的動態內存範圍;


4)讀/寫不適當的棧中內存塊;


5)內存泄漏,指向一塊內存的指針永遠丟失;


6)不正確的malloc/free或new/delete匹配;


7)memcpy()相關函數中的dst和src指針重疊問題。

Memcheck 檢查步驟及註意事項

1)在編譯程序的時候打開調試模式(gcc編譯器的-g選項),以便顯示行號,編譯時去掉-O1 -O2等優化選項;檢查的C++程序的時候,考慮加上選項: -fno-inline ,這樣它函數調用鏈會很清晰

2)執行:valgrind --tool=memcheck --leak-check=full --log-file=./log.txt ./YourProgram

3)程序運行結束,查看 log.txt 中的結果。

結果分析

Valgrind(memcheck)包含這7類錯誤,黑體為一般的錯誤提示:


1)illegal read/illegal write errors 非法讀取/非法寫入錯誤

2)use of uninitialised values 使用未初始化的區域

3)use of uninitialised or unaddressable values in system calls 系統調用時使用了未初始化或不可尋址的地址



4)illegal frees 非法的釋放

5)when a heap block is freed with an inappropriate deallocation function 分配和釋放函數不匹配

6)overlapping source and destination blocks 源和目的內存塊重疊

7)memory leak detection 內存泄漏檢測

7.1 Still reachable
內存指針還在還有機會使用或者釋放,指針指向的動態內存還沒有被釋放就退出了


7.2 Definitely lost
確定的內存泄露,已經不能夠訪問這塊內存


7.3 Indirectly lost
指向該內存的指針都位於內存泄露處


7.4 Possibly lost
可能的內存泄露,仍然存在某個指針能夠訪問某塊內存,但該指針指向的已經不是該內

  存首位置
7.5 Suppressed 某些庫產生的錯誤不予以提示,這些錯誤會被統計到suppressed項目

C/C++內存檢測工具Valgrind