Valgrind編譯安裝、使用方法

valgrind

一、valgrind編譯安裝

1.下載源代碼,下載地址:http://valgrind.org/downloads/current.html#current  點擊打開鏈接  (目前版本3.12.0)
2.在源碼目錄下執行:
./configure --prefix=[你自己的安裝目錄]    設置環境變量時需要用到該地址
make
make install
3.配置環境變量
vim ~/.bashrc  在最後一行添加 PATH=${PATH}:/valgrind/bin [你自己的安裝目錄]
source ~/.bashrc
4.測試一下,檢查是否安裝成功
valgrind ls -l 顯示如下內容,表示安裝成功

二、valgrind概觀

    1、memcheck:檢查程序中的內存問題,如泄漏、越界、非法指針等。

    2、callgrind:檢測程序代碼覆蓋,以及分析程序性能。

    3、cachegrind:分析CPU的cache命中率、丟失率,用於進行代碼優化。

    4、helgrind:用於檢查多線程程序的競態條件。

    5、massif:堆棧分析器,指示程序中使用了多少堆內存等信息。

三、工具詳解

1.Memcheck

    最常用的工具,用來檢測程序中出現的內存問題,所有對內存的讀寫都會被檢測到,一切對malloc、free、new、delete的調用都會被捕獲。所以,它能檢測以下問題:

       1、對未初始化內存的使用;

       2、讀/寫釋放後的內存塊;

       3、讀/寫超出malloc分配的內存塊;

       4、讀/寫不適當的棧中內存塊;

       5、內存泄漏,指向一塊內存的指針永遠丟失;

       6、不正確的malloc/free或new/delete匹配;

       7、memcpy()相關函數中的dst和src指針重疊。

這些問題往往是C/C++程序員最頭疼的問題,Memcheck能在這裏幫上大忙。

2.Callgrind

    和gprof類似的分析工具,但它對程序的運行觀察更是入微,能給我們提供更多的信息。和gprof不同,它不需要在編譯源代碼時附加特殊選項,但加上調試選項是推薦的。Callgrind收集程序運行時的一些數據,建立函數調用關係圖,還可以有選擇地進行cache模擬。在運行結束時,它會把分析數據寫入一個文件。callgrind_annotate可以把這個文件的內容轉化成可讀的形式。

    說明:這個工具我也沒有用會,網上基本沒有找到有指導性的文檔,暫時留在後面慢慢研究吧。

3.Cachegrind

       Cache分析器,它模擬CPU中的一級緩存I1,Dl和二級緩存,能夠精確地指出程序中cache的丟失和命中。如果需要,它還能夠爲我們提供cache丟失次數,內存引用次數,以及每行代碼,每個函數,每個模塊,整個程序產生的指令數。這對優化程序有很大的幫助。

    作一下廣告:valgrind自身利用該工具在過去幾個月內使性能提高了25%-30%。據早先報道,kde的開發team也對valgrind在提高kde性能方面的幫助表示感謝。

4.Helgrind

    它主要用來檢查多線程程序中出現的競爭問題。Helgrind尋找內存中被多個線程訪問,而又沒有一貫加鎖的區域,這些區域往往是線程之間失去同步的地方,而且會導致難以發掘的錯誤。Helgrind實現了名爲“Eraser”的競爭檢測算法,並做了進一步改進,減少了報告錯誤的次數。不過,Helgrind仍然處於實驗階段。

5. Massif

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

       Massif對內存的分配和釋放做profile。程序開發者通過它可以深入瞭解程序的內存使用行爲,從而對內存使用進行優化。這個功能對C++尤其有用,因爲C++有很多隱藏的內存分配和釋放

此外,lackey和nulgrind也會提供。Lackey是小型工具,很少用到;Nulgrind只是爲開發者展示如何創建一個工具。我們就不做介紹了。

四、valgrind使用

1.常用命令

valgrind --version   查看版本信息
valgrind --help(valgrind -h)      顯示幫助信息
valgrind --quiet  (valgrind -q) 只打印錯誤信息
valgrind --verbose (valgrind -v) 打印詳細信息
valgrind --toll=<toolname>[default:memcheck] 運行valgrind中的工具
valgrind --db-attach=<yes|no>[default:no] 綁定到調試器上

2.memcheck工具常用選項

    leak-check

    --leak-check=<no|summary|yes|full> [default: summary]

    用於控制內存泄漏檢測力度

    no:不檢測內存泄漏

    summary:僅報告總共泄漏的數量,不報告具體泄漏位置

    yes/full:報告泄漏總數、泄漏的具體位置

    show-reachable

        --show-reachable=<yes|no> [default: no]

    用於控制是否檢測控制範圍之外的泄漏,比如全局指針、static指針等

    undef-value-errors

        --undef-value-errors=<yes|no> [default: yes]

    用於控制是否檢測代碼中使用未初始化變量的情況

    其他選項

    --log-file=filename 將結果輸出到文件

    --log-socket=10.10.10.10:888 輸出到網絡

    --trace-children=<yes|no> [default: no]

        --track-fds=<yes|no> [default: no]

        --log-fd=<number> [default: 2, stderr]

        --xml=<yes|no> [default: no]

        --num-callers=<number> [default: 12]

        --show-below-main=<yes|no> [default: no]



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章