Valgrind確實是強大的工具


Linux程序內存錯誤調試中,Valgrind確實是強大的工具。其中Memcheck工具用於查內存越界、內存泄漏,Massif工具用於跟蹤程序內各函數的內存使用情況,以及Profiler等一系列工具。

最近維護一個程序,總是跑半小時就崩,每次崩的位置都不一樣。經查,是該程序狂吃內存,最終導致內存耗盡。用Memcheck查並沒有內存泄漏,於是使用Massif工具跟蹤內存使用狀況,從輸出結果中一目了然地發現了問題的原因:代碼中有一個地方在循環地創建線程,卻沒有及時銷毀線程,而是把線程的銷毀留給了整個進程的退出部分,怪不得光吃內存,卻沒有內存泄漏。於是很容易地就將這個問題修正了。 

如果Massif報告的內存占用量和top命令顯示的內存占用量不一致,就需要加--pages-as-heap=yes參數,這樣能底層的跟蹤內存,以獲得全部內存使用數據。

對內存越界,Memcheck似乎只能檢測堆的越界,而不能檢測棧的越界。因此,如果你認為程序中有越界錯誤,但Memcheck沒有檢測出時,應該是某個數組的size設小了導致的。查看哪個變量的值被不正當改變了,然后用gdb的watch跟蹤該變量,通常就可定位到導致越界的代碼。

 

Valgrind還可以和gdb配合使用。用法:

valgrind --vgdb=yes --vgdb-error=0 your_prog

然后在另一個shell中用gdb調試your_prog,然后:

(gdb) target remote | vgdb

此時就可以使用continue命令來執行程序了(vgdb不支持run命令),Valgrind一檢測到錯誤,程序就會在gdb中自動停下來供調試。

 

本文並不是一篇Valgrind教程。Valgrind的文檔在這里:http://valgrind.org/docs/manual/manual.html。這個文檔非常好,結合着例子講解各工具的用法,很好懂。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM