安裝Valgrind並檢查記憶體洩露

2021-10-09 08:12:11 字數 2912 閱讀 3751

**:

第二種方式:使用二進位製包安裝,以ubuntu 14.04 64bit為例,輸入下面的安裝命令

sudo apt-get install valgrind

所以最好的方法,我選擇下面的第三種方法:

valgrind使用方法

用法: valgrind [options] prog-and-args [options]: 

常用選項,適用於所有valgrind工具

-tool=最常用的選項。執行 valgrind中名為toolname的工具。預設memcheck。

h –help 顯示幫助資訊。

-version 顯示valgrind核心的版本,每個工具都有各自的版本。

q –quiet 安靜地執行,只列印錯誤資訊。

v –verbose 更詳細的資訊, 增加錯誤數統計。

-trace-children=no|yes 跟蹤子執行緒? [no]

-track-fds=no|yes 跟蹤開啟的檔案描述符?[no]

-time-stamp=no|yes 增加時間戳到log資訊? [no]

-log-fd=輸出log到描述符檔案 [2=stderr]

-log-file=將輸出的資訊寫入到filename.pid的檔案裡,pid是執行程式的進行id

-log-file-exactly=輸出log資訊到 file

-log-file-qualifier=取得環境變數的值來做為輸出資訊的檔名。 [none]

-log-socket=ipaddr:port 輸出log到socket ,ipaddr:port

log資訊輸出

-xml=yes 將資訊以xml格式輸出,只有memcheck可用

-num-callers=show callers in stack traces [12]

-error-limit=no|yes 如果太多錯誤,則停止顯示新錯誤? [yes]

-error-exitcode=如果發現錯誤則返回錯誤** [0=disable]

-db-attach=no|yes 當出現錯誤,valgrind會自動啟動偵錯程式gdb。[no]

-db-command=啟動偵錯程式的命令列選項[gdb -nw %f %p]

-leak-check=no|summary|full 要求對leak給出詳細資訊? [summary]

-leak-resolution=low|med|high how much bt merging in leak check [low]

-show-reachable=no|yes show reachable blocks in leak check? [no]

valgrind使用舉例

下面是一段明顯有問題的**檔案valgrind_demo.c,我們使用valgrind來查詢它的錯誤。

//gcc -wall -g valgrind_demo.c -o valgrind_demo//#includevoid f(void)

int main(int argc, char* ar**)

首先編譯程式

gcc -wall -g valgrind_demo.c -o valgrind_demo

這裡使用-wall是開啟編譯過程中所有的warning, -g是便於我們更仔細地除錯程式.

然後執行程式,使用valgrind來檢查該程式的bug

valgrind --tool=memcheck --leak-check=full valgrind_demo

下面是valgrind檢查效果截圖

從截圖的最後乙個標註處看出,該程式有2處錯誤, 分別位於**的兩個地方:

先看第乙個問題, 是有4個位元組的非法寫入, valgrind檢查到valgrind_demo.c檔案的main函式12行呼叫了f函式, f函式在第6行**處呼叫malloc分配了40個位元組的記憶體; 接著在f的第7行**處, 在分配的40個位元組的後面緊接著要寫入4位元組,這顯然是非法的, 因為40位元組以外的記憶體我們沒有分配,的確是非法寫入(陣列越界).

再看第二個問題, 說40位元組的乙個記憶體塊肯定會丟失,也就是記憶體洩露, 這個記憶體是在main函式的12行, 呼叫f函式中的malloc來進行分配的(記憶體空間沒有釋放).

從上面可以看出, valgrind提供的診斷資訊還是非常準確的, 在實際除錯**過程中, 很值得我們使用它來檢測大型程式的記憶體洩露問題.

如果在大型程式中會輸出大量的診斷資訊到控制台上, 我們可以採用將診斷資訊輸入進本地檔案的方法, 使用下面的命令

valgrind --tool=memcheck --leak-check=full --log-file=mem_leak.log valgrind_demo

這樣會在當前目錄下自動建立乙個檔案mem_leak.log來儲存診斷資訊,如果該檔案已經存在,它會被overwrite

也可以邊gdb除錯, 邊使用valgrind檢測記憶體錯誤

valgrind --tool=memcheck --leak-check=full --log-file=mem_leak.log gdb valgrind_demo

這個好處是,當程式有段錯誤時,可以使用bt檢視棧幀中的變數, 便於分析問題, 同時又可以檢視本地日誌資訊, 根據valgrind的診斷資訊來更進一步定位錯誤**出處.

記憶體檢查工具valgrind

valgrind是一套linux下的開放源 的 除錯工具的集合。valgrind由核心以及基於核心的其他除錯工具組成。valgrind包括以下的一些工具 在了解valgrind之前可以了解一下linux程式記憶體空間布局 0指定安裝路徑和生成makefile configure prefix hom...

使用valgrind來檢查記憶體洩漏

之前寫 有少量的記憶體洩露,平時沒發現,長時間執行才發現問題。為以後更方便的檢測記憶體洩漏問題,於是學習使用了valgrind來對記憶體洩漏進行檢測。valgrind不止可以檢測記憶體洩露,但目前只使用這一功能。configure make make install 如遇提示許可權不夠,make前加...

使用valgrind來檢查記憶體洩漏

之前寫 有少量的記憶體洩露,平時沒發現,長時間執行才發現問題。為以後更方便的檢測記憶體洩漏問題,於是學習使用了valgrind來對記憶體洩漏進行檢測。valgrind不止可以檢測記憶體洩露,但目前只使用這一功能。1.安裝 configure make make install 如遇提示許可權不夠,m...