首页 > 在Ubuntu 14.04 64bit上安装Valgrind并检查内存泄露

在Ubuntu 14.04 64bit上安装Valgrind并检查内存泄露

valgrind官网:http://valgrind.org/



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= 最常用的选项。运行 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= 输出LOG到描述符文件 [2=stderr]

-log-file= 将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID

-log-file-exactly= 输出LOG信息到 file

-log-file-qualifier= 取得环境变量的值来做为输出信息的文件名。 [none]

-log-socket=ipaddr:port 输出LOG到socket ,ipaddr:port



LOG信息输出

-xml=yes 将信息以xml格式输出,只有memcheck可用

-num-callers= show callers in stack traces [12]

-error-limit=no|yes 如果太多错误,则停止显示新错误? [yes]

-error-exitcode= 如果发现错误则返回错误代码 [0=disable]

-db-attach=no|yes 当出现错误,valgrind会自动启动调试器gdb。[no]

-db-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 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的诊断信息来更进一步定位错误代码出处.

更多相关:

  • linux valgrind memCheck —内存检查工具的可视化方法valkyrie linux valgrind Memcheck–内存检查工具 1、安装valgrind valgrind 安装 安装过程没这么复杂。 直接命令行: sudo apt-get install valgrind 2、安装valkyrie...

  • 原来我们可以从官网 http://trafficserver.apache.org/tools/via 获取via头的解码信息来得到指定url的缓存状态信息,现在我们可以直接利用本地工具就可以达到目的。 traffic_via工具能够解码Via头信息,输入的参数要求是[]包含的字符串。 使用方法: 参考...

  • 简介 channel_stats插件能对每个channel收集运行时统计信息(速率,请求数,更多选项将在未来添加),这些统计信息通过http json方式输出,这些 接口代码取自stats_over_http插件。通常,该插件只用于具有*固定*个数的remap规则的反向代理服务器,它并非为那些不限制channel的代理服务器,比如op...

  • logger是一个shell命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息 logger语法: 可以使用的相关命令 -d, --udp 使用数据报(UDP)而不是使用默认的流连接(TCP) -i, --id 逐行记录每一次logger的进程ID -f, --fil...

  • 今天在测试中遇到了一个问题 使用JMeter时请求相关地址参数及方法都填写正确,但是相应数据返回始终不对,例如 查看取样器结果显示 200 正常,但响应数据不符合正常的结果。 经反复检查发现问题如下: 1)没有添加HTTP信息头管理器 (获取根据就近原则) 2)HTTP信息头管理器中填写错误,将Content-Type 填写成了Co...

  • 第一,你要有log4j的对应的包,由于我用的maven,所以直接在pom.xml文件依赖下载则可,如你尚为有此包,请自行百度下载导入,或上http://www.mvnrepository.com/搜索。上如则是我的log4j的包的版本。好了,用了jar包之后,用来学习的项目结构如下:在对应的路径下创建log4Test.java和log...

  • linux valgrind 安装和使用 安装过程没这么复杂。 直接命令行: sudo apt-get install valgrind Valgrind 是个开源的工具,功能很多。例如检查内存泄漏工具—memcheck。 Valgrind 安装: sudo apt-get install valgrind Valgri...

  • 不知大家有没有遇见过自己写的tableview被导航栏遮挡住的问题,反正我是遇见过! 因为在ios7以后所有的UIViewController创建后默认就是full Screen的,因此如果带导航栏的应用界面中的部分控件会被导航栏覆盖掉。   解决方案:可以使用ios7中的UIViewController新增的属性extendLayo...