【內存泄漏】方法三:利用linux的valgrind命令定位內存泄露(Memory Leak)


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

清單 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

清單 2

  • 左邊顯示類似行號的數字(32372)表示的是 Process ID。
  • 最上面的紅色方框表示的是 valgrind 的版本信息。
  • 中間的紅色方框表示 valgrind 通過運行被測試程序,發現的內存問題。通過閱讀這些信息,可以發現:
    1. 這是一個對內存的非法寫操作,非法寫操作的內存是4 bytes。
    2. 發生錯誤時的函數堆棧,以及具體的源代碼行號。
    3. 非法寫操作的具體地址空間。
  • 最下面的紅色方框是對發現的內存問題和內存泄露問題的總結。內存泄露的大小(40 bytes)也能夠被檢測出來。

示例程序顯然有兩個問題,一是fun函數中動態申請的堆內存沒有釋放;二是對堆內存的訪問越界。這兩個問題均被valgrind發現。


免責聲明!

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



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