介绍
Valgrind是一套调试和分析工具。它的一个被广泛使用的默认工具——‘Memcheck’——可以拦截malloc(),new(),free()和delete()调用。换句话说,它在检测下面这些问题非常有用:
内存泄露
重释放
访问越界
使用未初始化的内存
使用已经被释放的内存等。
它直接通过可执行文件运行。
Valgrind也有一些缺点,因为它增加了内存占用,会减慢你的程序。它有时会造成误报和漏报。它不能检测出静态分配的数组的访问越界问题
Memcheck。这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。这也是本文将重点介绍的部分。
Callgrind。它主要用来检查程序中函数调用过程中出现的问题。
Cachegrind。它主要用来检查程序中缓存使用出现的问题。
Helgrind。它主要用来检查多线程程序中出现的竞争问题。
Massif。它主要用来检查程序中堆栈使用中出现的问题。
Extension。可以利用core提供的功能,自己编写特定的内存调试
安装
命令行安装
sudo apt-get install valgrind
源码安装
wget http://www.valgrind.org/downloads/valgrind-3.14.0.tar.bz2
tar -jxvf valgrind-3.14.0.tar.bz2
cd valgrind-3.14.0
./configure --prefix=/home/user1/valgrind
make
make install
配置
vi ~/.bashrc
添加
export PATH=$PATH:~/valgrind/bin/
source ~/.bashrc
使用
用法: 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 callersin 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 leakcheck [low]
-show-reachable=no|yesshow reachable blocks in leak check? [no]
直接输出
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --run-libc-freeres=yes ./main
输出到日志
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --run-libc-freeres=yes --log-file=./valgrind_report.log ./main $@