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