valgrind
一、valgrind編譯安裝
二、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.常用命令
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]