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...