天天看點

Linux平台下的valgrind工具記錄

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

Linux平台下的valgrind工具記錄

繼續閱讀