linux系统定位内存泄露方法Valgrind与AddressSanitizer

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= 是最常用的选项,用于选择使用valgrind工具集中的哪一个工具,默认值为memcheck;

-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到描述符文件 [2=stderr]

--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

你可能感兴趣的:(linux,运维,服务器,c语言)