Valgrind 安裝
命令: sudo apt-get install valgrind
轉載於:https://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/index.html
Valgrind 使用
第一步:准備好程序
為了使valgrind發現的錯誤更精確,如能夠定位到源代碼行,建議在編譯時加上-g參數,編譯優化選項請選擇O0,雖然這會降低程序的執行效率。
這里用到的示例程序文件名為:sample.c(如下所示),選用的編譯器為gcc。
生成可執行程序 gcc –g –O0 sample.c –o sample
清單 1
第二步:在valgrind下,運行可執行程序。
利用valgrind調試內存問題,不需要重新編譯源程序,它的輸入就是二進制的可執行程序。調用Valgrind的通用格式是:valgrind [valgrind-options] your-prog [your-prog-options]
Valgrind 的參數分為兩類,一類是 core 的參數,它對所有的工具都適用;另外一類就是具體某個工具如 memcheck 的參數。Valgrind 默認的工具就是 memcheck,也可以通過“--tool=tool name”指定其他的工具。Valgrind 提供了大量的參數滿足你特定的調試需求,具體可參考其用戶手冊。
這個例子將使用 memcheck,於是可以輸入命令入下:valgrind <Path>/sample.
第三步:分析 valgrind 的輸出信息。
以下是運行上述命令后的輸出。
清單 2
- 左邊顯示類似行號的數字(32372)表示的是 Process ID。
- 最上面的紅色方框表示的是 valgrind 的版本信息。
- 中間的紅色方框表示 valgrind 通過運行被測試程序,發現的內存問題。通過閱讀這些信息,可以發現:
- 這是一個對內存的非法寫操作,非法寫操作的內存是4 bytes。
- 發生錯誤時的函數堆棧,以及具體的源代碼行號。
- 非法寫操作的具體地址空間。
- 最下面的紅色方框是對發現的內存問題和內存泄露問題的總結。內存泄露的大小(40 bytes)也能夠被檢測出來。
示例程序顯然有兩個問題,一是fun函數中動態申請的堆內存沒有釋放;二是對堆內存的訪問越界。這兩個問題均被valgrind發現。