Valgrind工具下载:
网址a
Valgrind: Current Releases
网址b
Index of /pub/valgrind
编译方法:
tar xjvf valgrind-3.15.0.tar.bz2
cd valgrind-3.15.0
chmod 775 autogen.sh
./autogen.sh
#如果提示aclocal相关信息,则需要 yum install autoconf automake
./configure
make
make install
valgrind是用于构建动态分析工具的装备性框架,它包括一个工具集,每个工具执行某种类型的调试,分析或类似的任务,以帮助完善你的程序,valgrind的架构是模块化的,所以可以容易的创新的工具而又不会扰乱现有的结构.
valgrind提供如下工具:
memcheck 是一个内存错误侦测器,它有助于使你的程序,尤其c/c++来写的程序更加准确.
cachegrind 是一个缓存和分支预测分析器,有助于提高程序的运行性能.
callgrind 是一个调用图缓存生成分析器,它与cachegrind功能有重叠,但也搜集cachegrind不搜集的一些信息.
helgrind 是一个线程错误检测器,它有助于使你的多线程程序更加准确.
DRD 也是一个线程错误检测器,和helgrind使用技术不同,所以可以找到不同问题
massif 是一个堆分析器,有助于使你的程序使用更少的内存
DHAT 是另一种不同的堆分析器。它有助于理解块(block)的生命周期、块的使用和布局的低效等问题;
1) Memcheck
最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc、free、new、delete的调用都会被捕获。所以,它能检测以下问题:
1. 对未初始化内存的使用; 2. 读/写释放后的内存块; 3. 读/写超出malloc分配的内存块; 4. 读/写不适当的栈中内存块; 5. 内存泄露,指向一块内存的指针永远丢失; 6. 不正确的malloc/free或者new/delete匹配; 7. memcpy()相关函数中的dst和src指针重叠;
这些问题往往是C/C++程序员最头疼的问题,Memcheck能在这里帮上大忙。
1.3 valgrind常用选项
valgrind的基本使用格式如下:
valgrind [options] prog-and-args
其支持众多选项,我们可以通过valgrind --help来进行查看。这里我们只介绍几个较为常用的选项:
[options]
--tool=
-v/--version 显示valgrind内核的版本,每个工具都有各自的版本;
-h/–help 显示帮助信息;
-q --quiet 安静的运行,只打印错误消息;
-v -–verbose 打印更详细的信息
--trace-children=no|yes 是否跟踪子进程,默认值为no;
--track-fds=no|yes 是否追踪打开的文件描述符,默认为no;
--track-origins=yes查看未初始化值的来源
--time-stamp=no|yes 是否在打印出的每条消息之前加上时间戳信息,默认值为no
--log-fd=
--log-file=
--num-callers= 检测函数调用次数(默认12最大50)
--error-limit= [default: yes] 当这个选项打开时,在总量达到10,000,000,或者1,000个不同的错误,Valgrind停止报告错误
--suppressions= [绝对文件名] 指定一个额外的文件读取不需要理会的错误; 你可以根据需要使用任意多的额外文件
适用于Memcheck工具的相关选项:
--leak-check=no|summary|full 在退出时是否查找内存泄露。默认值为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]
eg:
valgrind --log-file=output.txt --tool=memcheck --leak-check=full --show-reachable=yes --track-fds=yes ./test (其中./test为要检测的运行程序,编译时最好带上-g)
二,AddressSanitizer工具gcc集成工具:
安装这个rpm包:
gcc编译带参数:
gcc -fsanitize=address -g -fno-omit-frame-pointer -o0 -o test test.c