Valgrind 記憶體檢測工具

2021-06-28 09:03:11 字數 3428 閱讀 6511

valgrind是乙個gpl的軟體,用於linux(for x86, amd64 and ppc32)程式的記憶體除錯和**剖析。你可以在它的環境中執行你的程式來監視記憶體的使用情況,比如c 語言中的malloc和free或者 c++中的new和 delete。使用valgrind的工具包,你可以自動的檢測許多記憶體管理和執行緒的bug,避免花費太多的時間在bug尋找上,使得你的程式更加穩固。

valgrind的主要功能

valgrind工具包包含多個工具,如memcheck,cachegrind,helgrind, callgrind,massif。下面分別介紹個工具的作用:

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 )

callgrind

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

cachegrind

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

helgrind

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

massif

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

valgrind 安裝

1、 到

2、 解壓安裝包:tar –jxvf valgrind-3.2.3.tar.bz2

3、 解壓後生成目錄valgrind-3.2.3

4、 cd valgrind-3.2.3

5、 ./configure

6、 make;sudo make install

注意:不要移動valgrind到乙個與--prefix指定的不一樣的目錄,這將導致一些莫名其妙的錯誤,大多數在valgrind處理/fork/exec呼叫時。

1.檢查記憶體錯誤:

例如我們原來有乙個程式test,這是乙個用gcc –g引數編譯的程式,執行它需要:

#./a.out

如果我們想用valgrind的記憶體檢測工具,我們就要用如下方法呼叫:

#valgrind --leak-check=full --show-reachable=yes --trace-children= yes   ./a.out 

logfile加上會好些,程式在執行期間stderr會有一些輸出。加上logfile的話可以像dmalloc那樣開啟logfile來檢視錯誤資訊。

其中--leak-check=full 指的是完全檢查記憶體洩漏,--show-reachable=yes是顯示記憶體洩漏的地點,--trace-children=yes是跟入子程序。

如果您的程式是會正常退出的程式,那麼當程式退出的時候valgrind自然會輸出記憶體洩漏的資訊。如果您的程式是個守護程序,那麼也不要緊,我們 只要在別的終端下殺死memcheck程序(因為valgrind預設使用memcheck工具,就是預設引數—tools=memcheck):

#killall memcheck

這樣我們的程式(./a.out)就被kill了

2.檢查**覆蓋和效能瓶頸:

我們呼叫valgrind的工具執行程式:

#valgrind --tool=callgrind ./sec_infod

會在當前路徑下生成callgrind.out.pid(當前生產的是callgrind.out.19689),如果我們想結束程式,可以:

#killall callgrind

然後我們看一下結果:

#callgrind_annotate --auto=yes callgrind.out.19689   >log

#vim log

3.valgrind使用引數

--log-fd=n 預設情況下,輸出資訊是到標準錯誤stderr,也可以通過—log-fd=8,輸出到描述符為8的檔案

--log-file=filename將輸出的資訊寫入到filename.pid的檔案裡,pid是執行程式的進行id。可以通過--log- file exactly=filename指定就輸出到filename檔案。

--log-file-qualifier=,取得環境變數的值來做為輸出資訊的檔名。如—log-file- qualifier=$filename。

--log-socket=ip:port 也可以把輸出資訊傳送到網路中指定的ip:port去

--error-limit=no 對錯誤報告的個資料進行限制,預設情況不做限制

--tool=[default: memcheck]

--tool=memcheck:要求用memcheck這個工具對程式進行分析

--leak-ckeck=yes 要求對leak給出詳細資訊

--trace-children=[default: no]跟蹤到子程序裡去,預設請況不跟蹤

--xml=[default: no]將資訊以xml格式輸出,只有memcheck可用

--gen-suppressions=[default: no]如果為yes,valgrind會在每發現乙個錯誤便停下讓使用者做選擇是繼續還是退出

可以把一些預設選項編輯在 ~/.valgrindrc檔案裡。

這裡使用valgrind的memcheck和callgrind兩個工具的用法,其實valgrind還有幾個工具:「cachegrind」,用於檢查快取使用的;「helgrind」用於檢測多執行緒競爭資源的,等等。

與dmalloc相比,valgrind使用範圍更廣,它不但能夠檢測出堆記憶體的洩露,對執行緒間使用共同資源所帶來的記憶體洩露也能夠察覺出來,但是valgrind所產生的log資訊往往比dmalloc多得多,有時候就是一千多行的log資訊,讓人看到就頭痛。

記憶體檢測工具Valgrind

valgrind是一套linux下,開放源 gpl v2 的 除錯工具的集合。valgrind由核心 core 以及基於核心的其他除錯工具組成。核心類似於乙個框架 framework 它模擬了乙個cpu環境,並提供服務給其他工具 而其他工具則類似於外掛程式 plug in 利用核心提供的服務完成各種...

記憶體洩露檢測工具 valgrind

valgrind 安裝 2.解壓安裝包 tar jxvf valgrind 3.2.3.tar.bz2 3.解壓後生成目錄valgrind 3.2.3 4.cd valgrind 3.2.3 5.執行.autogen.sh設定環境 需要標準的autoconf工具 可選 6.configure 配置v...

valgrind記憶體洩露檢測工具

一 安裝 valgrind linux環境首先進入root使用者 然後執行下面的命令 tar jxvf valgrind 3.12.0.tar.bz2 cd valgrind 3.12.0 configure make make install valgrind version 檢視valgrind...