Linux平台下的valgrind工具記錄
——Ubuntu14.04.5
apt-get install python graphviz valgrind
注:安裝這三個工具
gcc -Wall -g valgrind_demo.c -o valgrind_demo
注:編譯示例程式
Valgrind包含下列工具:
1、memcheck:檢查程式中的記憶體問題,如洩漏、越界、非法指針等。
2、callgrind:檢測程式代碼的運作時間和調用過程,以及分析程式性能。
3、cachegrind:分析CPU的cache命中率、丢失率,用于進行代碼優化。
4、helgrind:用于檢查多線程程式的競态條件。
5、massif:堆棧分析器,訓示程式中使用了多少堆記憶體等資訊。
6、lackey:
7、nulgrind:
這幾個工具的使用是通過指令:valgrand --tool=name 程式名來分别調用的,當不指定tool參數時預設是 --tool=memcheck
memcheck工具
其中memcheck能檢測以下問題:
1、對未初始化記憶體的使用;
2、讀/寫釋放後的記憶體塊;
3、讀/寫超出malloc配置設定的記憶體塊;
4、讀/寫不适當的棧中記憶體塊;
5、記憶體洩漏,指向一塊記憶體的指針永遠丢失;
6、不正确的malloc/free或new/delete比對;
7、memcpy()相關函數中的dst和src指針重疊。
valgrind --tool=memcheck ./memleak
或者
valgrind --tool=memcheck --leak-check=full ./memleak
檢查記憶體洩露和指針越限的問題
也可以結合gdb使用,例如:valgrind --tool=memcheck --leak-check=full gdbmemleak
也可以将輸出定義為檔案,例如:valgrind--tool=memcheck --leak-check=full --log-file=mem_leak.log gdb valgrind_demo
callgrind工具
還有callgrind和gprof類似的分析工具,但它對程式的運作觀察更是入微,能給我們提供更多的資訊。和gprof不同,它不需要在編譯源代碼時附加特殊選項,但加上調試選項是推薦的。Callgrind收集程式運作時的一些資料,建立函數調用關系圖,還可以有選擇地進行cache模拟。在運作結束時,它會把分析資料寫入一個檔案。callgrind_annotate可以把這個檔案的内容轉化成可讀的形式。
生成callgrind.out檔案,例如:valgrind--tool=callgrind ./valgrind_demo
其中 ./valgrind_demo就是我們要分析的程式。執行完畢後,就會在目前目錄下生成一個檔案。檔案名為“callgrind.out.程序号”。如,callgrind.out.31113。注意,對于daemon程序的調試,不要通過kill -9方式停止。如果你調試的程式是多線程,你也可以在指令行中加一個參數–separate-threads=yes。這樣就會為每個線程單獨生成一個性能分析檔案。
把callgrind生成的性能資料轉換成dot格式資料需要使用gprof2dot.py腳本,這個隻是個腳本可以放到/usr/sbin/中,這個腳本用來把callgrind生成的性能資料轉換成dot格式資料
python/usr/sbin/gprof2dot.py -f callgrind -n10 -s callgrind.out.31113 >valgrind_demo.dot
使用dot把資料生成圖檔
dot -Tpngvalgrind_demo.dot -o valgrind_demo.png
