在Ubuntu 14.04 64bit上安装Valgrind并检查内存泄露
1.安裝方法
第一種方式:下載目前最新的源碼,編譯安裝,在服務器上推薦這種方式
wget http://valgrind.org/downloads/valgrind-3.9.0.tar.bz2
tar xvf valgrind-3.9.0.tar.bz2
cd valgrind-3.9.0/
./configure
make
make install
第二種方式:使用二進制包安裝,以Ubuntu 14.04 64bit為例,輸入下面的安裝命令
sudo apt-get install valgrind
這個可能需要下載很大的安裝文件,如果在下載過程中中斷了,會造成以后無法再安裝其他的軟件,除非你下次升級軟件之前,先完成上面的安裝。
所以最好的方法,我選擇下面的第三種方法:
第三種方式:為了加快速度,現在chrome瀏覽器中下載二進制包,在ubuntu下是.deb包。這是我采用的方法。下載地址為:http://pkgs.org/download/valgrind,注意不同的系統和版本,對應的包是不一樣的。
ubuntu 14.04 64bit的deb包下載地址:
http://archive.ubuntu.com/ubuntu/pool/main/v/valgrind/valgrind_3.6.1-0ubuntu1_i386.deb
下載完成后雙擊,默認用software center安裝即可!參見下面的截圖
Valgrind使用方法
用法: valgrind [options] prog-and-args [options]:?
常用選項,適用于所有Valgrind工具
-tool=<name> 最常用的選項。運行 valgrind中名為toolname的工具。默認memcheck。
h –help 顯示幫助信息。
-version 顯示valgrind內核的版本,每個工具都有各自的版本。
q –quiet 安靜地運行,只打印錯誤信息。
v –verbose 更詳細的信息, 增加錯誤數統計。
-trace-children=no|yes 跟蹤子線程? [no]
-track-fds=no|yes 跟蹤打開的文件描述符?[no]
-time-stamp=no|yes 增加時間戳到LOG信息? [no]
-log-fd=<number> 輸出LOG到描述符文件 [2=stderr]
-log-file=<file> 將輸出的信息寫入到filename.PID的文件里,PID是運行程序的進行ID
-log-file-exactly=<file> 輸出LOG信息到 file
-log-file-qualifier=<VAR> 取得環境變量的值來做為輸出信息的文件名。 [none]
-log-socket=ipaddr:port 輸出LOG到socket ,ipaddr:port
LOG信息輸出
-xml=yes 將信息以xml格式輸出,只有memcheck可用
-num-callers=<number> show <number> callers in stack traces [12]
-error-limit=no|yes 如果太多錯誤,則停止顯示新錯誤? [yes]
-error-exitcode=<number> 如果發現錯誤則返回錯誤代碼 [0=disable]
-db-attach=no|yes 當出現錯誤,valgrind會自動啟動調試器gdb。[no]
-db-command=<command> 啟動調試器的命令行選項[gdb -nw %f %p]
適用于Memcheck工具的相關選項:
-leak-check=no|summary|full 要求對leak給出詳細信息? [summary]-leak-resolution=low|med|high how much bt merging in leak check [low]
-show-reachable=no|yes show reachable blocks in leak check? [no]
Valgrind使用舉例
下面是一段明顯有問題的代碼文件valgrind_demo.c,我們使用Valgrind來查找它的錯誤。
//gcc -Wall -g valgrind_demo.c -o valgrind_demo
//
#include <stdlib.h>void f(void){int* x = malloc(10 * sizeof(int));x[10] = 0; //問題1:內存越界//問題2:內存泄露
}int main(int argc, char* argv[]){f();return 0;
}首先編譯程序
gcc -Wall -g valgrind_demo.c -o valgrind_demo
這里使用-Wall是開啟編譯過程中所有的warning, -g是便于我們更仔細地調試程序.
然后運行程序,使用valgrind來檢查該程序的bug
valgrind --tool=memcheck --leak-check=full valgrind_demo
下面是valgrind檢查效果截圖
從截圖的最后一個標注處看出,該程序有2處錯誤, 分別位于代碼的兩個地方:
先看第一個問題, 是有4個字節的非法寫入, valgrind檢查到valgrind_demo.c文件的main函數12行調用了f函數, f函數在第6行代碼處調用malloc分配了40個字節的內存; 接著在f的第7行代碼處, 在分配的40個字節的后面緊接著要寫入4字節,這顯然是非法的, 因為40字節以外的內存我們沒有分配,的確是非法寫入(數組越界).
再看第二個問題, 說40字節的一個內存塊肯定會丟失,也就是內存泄露, 這個內存是在main函數的12行, 調用f函數中的malloc來進行分配的(內存空間沒有釋放).
從上面可以看出, valgrind提供的診斷信息還是非常準確的, 在實際調試代碼過程中, 很值得我們使用它來檢測大型程序的內存泄露問題.
如果在大型程序中會輸出大量的診斷信息到控制臺上, 我們可以采用將診斷信息輸入進本地文件的方法, 使用下面的命令
valgrind --tool=memcheck --leak-check=full --log-file=mem_leak.log valgrind_demo
這樣會在當前目錄下自動創建一個文件mem_leak.log來保存診斷信息,如果該文件已經存在,它會被overwrite
也可以邊gdb調試, 邊使用valgrind檢測內存錯誤
valgrind --tool=memcheck --leak-check=full --log-file=mem_leak.log gdb valgrind_demo
這個好處是,當程序有段錯誤時,可以使用bt查看棧幀中的變量, 便于分析問題, 同時又可以查看本地日志信息, 根據valgrind的診斷信息來更進一步定位錯誤代碼出處.
總結
以上是生活随笔為你收集整理的在Ubuntu 14.04 64bit上安装Valgrind并检查内存泄露的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Ubuntu 14.04 64bit上
- 下一篇: 使用valgrind检测ATS插件中的内