Valgrind 3.11.0编译安装
Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。
Valgrind遵守GNU通用公共许可证条款,是一款*软件。
到3.3.0版本为止,Valgrind支持x86、x86-64以及PowerPC上的Linux。除此之外,还有一些其它非正式支持的类Unix平台(如FreeBSD、NetBSD以及Mac OS X)。
1、下载Valgrind 3.11.0
直接下载源码包
wget http://valgrind.org/downloads/valgrind-3.11.0.tar.bz2
tar -xjvf valgrind-3.11.0.tar.bz2
cd valgrind-3.11.0/
使用svn克隆一个
svn co svn://svn.valgrind.org/valgrind/trunk valgrind
2、生成Makefile并使用它进行编译
生成Makefile
的步骤在README
这个文件中有写。
- 运行
./autogen.sh
来设置环境(你需要标准的autoconf
工具)
这个脚本其实是调用的aclocal
autoheader
automake
autoconf
,所以必须先安装好它,如果没有安装,在运行这个脚本的时候会提示你的。
- 运行
- 运行
./configure
来生成Makefile
文件
这里你可以使用./configure --help
来查看可以使用哪些参数设置。
一般设置好安装路径即可./configure --prefix=/usr/local/valgrind
- 运行
- 运行
make
进行编译,运行make install
进行安装。
- 运行
下面是我编译时候的步骤
#运行 autogen.sh
o@o-pc:~/software/valgrind-3.11.$ ./autogen.sh
running: aclocal
running: autoheader
running: automake -a
running: autoconf #运行configure
o@o-pc:~/software/valgrind-3.11.$ ./configure --prefix=/usr/local/valgrind
checking for a BSD-compatible install... /usr/bin/install -c
.... .....
config.status: executing depfiles commands Maximum build arch: amd64
Primary build arch: amd64
Secondary build arch: x86
Build OS: linux
... ... #运行make o@o-pc:~/software/valgrind-3.11.$ make
echo "# This is a generated file, composed of the following suppression rules:" > default.supp
echo "# " exp-sgcheck.supp xfree-.supp xfree-.supp glibc-.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-.X.supp >> default.supp
cat exp-sgcheck.supp xfree-.supp xfree-.supp glibc-.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-.X.supp >> default.supp
make all-recursive
... ...
#运行make install
o@o-pc:~/software/valgrind-3.11.$ sudo make install
[sudo] o 的密码:
make install-recursive
... ...
3、测试一下
编译完成之后可以测试一下。
因为上面编译安装的时候指定了安装目录,所以还需要把valgrind
的bin
目录路径添加到环境变量PATH
中。否则只能使用全路径来运行valgrind
这里我把它写入到~/.bashrc
文件中。打开~/.bashrc
文件,然后在最后添加一行PATH=${PATH}:/usr/local/valgrind/bin
,之后使用source ~/.bashrc
来更新一下。
真的测试一下哦(这是README里面给出的测试命令)
o@o-pc:~/software$ valgrind ls -l
==== Memcheck, a memory error detector
==== Copyright (C) -, and GNU GPL'd, by Julian Seward et al.
==== Using Valgrind-3.11. and LibVEX; rerun with -h for copyright info
==== Command: ls -l
====
总用量
drwxrwxr-x o o 12月 : valgrind-3.11.
-rw-rw-r-- o o 9月 : valgrind-3.11..tar.bz2
====
==== HEAP SUMMARY:
==== in use at exit: , bytes in blocks
==== total heap usage: allocs, frees, , bytes allocated
====
==== LEAK SUMMARY:
==== definitely lost: bytes in blocks
==== indirectly lost: bytes in blocks
==== possibly lost: bytes in blocks
==== still reachable: , bytes in blocks
==== suppressed: bytes in blocks
==== Rerun with --leak-check=full to see details of leaked memory
====
==== For counts of detected and suppressed errors, rerun with: -v
==== ERROR SUMMARY: errors from contexts (suppressed: from )
自己写一个内存访问越界和泄露的小例子来测试一下
#include <stdlib.h>
int main()
{
((char*)malloc())[] = ;
return ;
}
使用下面的命令来检查
valgrind --track-fds=yes --leak-check=full --undef-value-errors=yes ./test
检查结果
==== Memcheck, a memory error detector
==== Copyright (C) -, and GNU GPL'd, by Julian Seward et al.
==== Using Valgrind-3.11. and LibVEX; rerun with -h for copyright info
==== Command: ./test
====
==== Invalid write of size # 这里检测到了内存越界访问
==== at 0x400548: main (in /home/o/software/test)
==== Address 0x520204a is bytes after a block of size alloc'd
==== at 0x4C2BC50: malloc (vg_replace_malloc.c:)
==== by 0x400543: main (in /home/o/software/test)
====
====
==== FILE DESCRIPTORS: open at exit. #打开了三个文件描述符(标准输入输出错误)
==== Open file descriptor : /dev/pts/
==== <inherited from parent>
====
==== Open file descriptor : /dev/pts/
==== <inherited from parent>
====
==== Open file descriptor : /dev/pts/
==== <inherited from parent>
====
====
==== HEAP SUMMARY: #堆使用摘要
==== in use at exit: bytes in blocks
==== total heap usage: allocs, frees, bytes allocated #申请/释放详情
====
==== bytes in blocks are definitely lost in loss record of
==== at 0x4C2BC50: malloc (vg_replace_malloc.c:)
==== by 0x400543: main (in /home/o/software/test)
====
==== LEAK SUMMARY: 泄露摘要
==== definitely lost: bytes in blocks
==== indirectly lost: bytes in blocks
==== possibly lost: bytes in blocks
==== still reachable: bytes in blocks
==== suppressed: bytes in blocks
====
==== For counts of detected and suppressed errors, rerun with: -v
==== ERROR SUMMARY: errors from contexts (suppressed: from )
可以看出上面检测到了内存越界访问和内存泄露。
一般写玩程序后都可以使用valgrind
来检测一下,避免内存泄露的问题(还有文件打开情况)