当前位置:C++技术网 > 资讯 > Linux下检测内存泄漏工具Valgrind的安装

Linux下检测内存泄漏工具Valgrind的安装

更新时间:2017-03-22 16:51:24浏览次数:1+次

    Valgrind是Linux下的一款内存泄漏检测工具,功能很强大的。今天用了一番,查出来不少问题。感觉非常好的一个工具,所以在此推荐下这个工具。而之前在论坛里看到人家说这个没有用,有点极端了。当然如果代码太复杂了,可能检测不到,但是一般人写的代码还不至于太复杂,而且这个工具一直在不断地发展,功能也会越来越牛叉。
    我们先看看Valgrind的功能:
Valgrind支持很多工具:memcheck,addrcheck,cachegrind,Massif,helgrind和Callgrind等。在运行Valgrind时,你必须指明想用的工具,如果省略工具名,默认运行memcheck。

1、memcheck
    memcheck探测程序中内存管理存在的问题。它检查所有对内存的读/写操作,并截取所有的malloc/new/free/delete调用。因此memcheck工具能够探测到以下问题:
1)使用未初始化的内存
2)读/写已经被释放的内存
3)读/写内存越界
4)读/写不恰当的内存栈空间
5)内存泄漏
6)使用malloc/new/new[]和free/delete/delete[]不匹配。
7)src和dst的重叠

2、cachegrind
    cachegrind是一个cache剖析器。它模拟执行CPU中的L1, D1和L2 cache,因此它能很精确的指出代码中的cache未命中。如果你需要,它可以打印出cache未命中的次数,内存引用和发生cache未命中的每一行代码,每一个函数,每一个模块和整个程序的摘要。如果你要求更细致的信息,它可以打印出每一行机器码的未命中次数。在x86和amd64上, cachegrind通过CPUID自动探测机器的cache配置,所以在多数情况下它不再需要更多的配置信息了。

3、helgrind
    helgrind查找多线程程序中的竞争数据。helgrind查找内存地址,那些被多于一条线程访问的内存地址,但是没有使用一致的锁就会被查出。这表示这些地址在多线程间访问的时候没有进行同步,很可能会引起很难查找的时序问题。
    它主要用来检查多线程程序中出现的竞争问题。Helgrind 寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为”Eraser” 的竞争检测算法,并做了进一步改进,减少了报告错误的次数。

4、Callgrind
    Callgrind收集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cache 模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。

用法示例:
valgrind --tool=memcheck --leak-check=full 你的程序文件名
    --tool表示启用前面四个的哪一个工具,我们启用了memcheck内存检查工具。然后我们再完全启用内存泄漏检查leak-check为full,这样就可以检测所有的内存泄漏和内存错误了。
    比如下面是检测到sprintf使用错误:
Valgrind检测到sprintf使用错误

    下面来看看如何安装Valgrind:
1.下载Valgrind
wget http://www.valgrind.org/downloads/valgrind-3.12.0.tar.bz2
直接这样下载可能有点慢,你可以先下载到本地,然后上传到Linux上。
2.解压Valgrind压缩包
tar -jxvf valgrind-3.12.0.tar.bz2
3.进入解压后的目录
cd valgrind-3.12.0
4.运行脚本设置环境
./autogen.sh
    会自动执行autoconf等工具,如果系统没有安装会提示出错,那就先安装下。
5.配置Valgrind,生成MakeFile文件
./configure
6.编译Valgrind
make
7.安装Valgrind
make install


下面整理为一个命令序列:

wget http://www.valgrind.org/downloads/valgrind-3.12.0.tar.bz2
tar -jxvf valgrind-3.12.0.tar.bz2
cd valgrind-3.12.0
./autogen.sh
./configure
make
make install
    你可以将上面的命令序列保存为sh文件,然后就可以一键安装了。
    安装完后就可以使用了。使用方法见上面的用法示例。