在VS中可以用VLD检测是否有内存泄露,可以参考http://blog.csdn.net/fengbingchun/article/details/44195959,下面介绍下Ubuntu中内存泄露检测工具Valgrind的使用。
Valgrind目前最新版本是3.11.0, 可以从http://www.valgrind.org/ 通过下载源码进行编译,也可以通过命令直接安装。
Valgrind是一个开源软件,它的Lisence是GPLv2。它用于Linux(支持 x86, amd64,arm, ppc, mip, etc. 架构)平台,对C/C++程序进行内存调试和代码剖析,它是帮助程序员寻找程序里的bug和改进程序性能的工具。
Valgrind有多个工具,包括Memcheck、Cachegrind、Callgrind、Helgrind、DRD、Massif、DHAT、SGCheck、BBV:
1. Memcheck:主要检查的程序错误包括,(1)、使用未初始化的内存;(2)、读写已经释放了的内存;(3)、使用超过malloc分配的内存空间;(4)、对堆栈的非法访问;(5)、申请的空间是否有释放;(6)、malloc/free/new/delete申请和释放内存的匹配;(7)、src和dst指针的重叠;(8)、将无意义的参数传递给系统调用。
2. Cachegrind:它是一个cache剖析器,它模拟CPU中的一级缓存I1,D1和L2二级缓存,能够精确地指出程序中cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码、每个函数、每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。
3. Callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能。
4. Helgrind:它主要用来检查多线程程序中出现的竞争问题。Helgrind寻找内存中被多个线程访问,而又没有加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为”Eraser”的竞争检测算法,并做了进一步改进,减少了报告错误的次数。
5. DRD:用于分析多线程,与Helgrind类似,但是用不同的分析技术,可用检测不同的问题。
6. Massif:堆栈分析器,它能够测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。
7. DHAT:另一个堆检测工具,帮助了解代码段的生命周期、利用率、效率规划。
8. SGCheck:检测栈和全局数组溢出的实验性工具,与Memcheck互补使用。
9. BBV:通过SimPoint分析工具产生基本块向量。
Valgrind工具的更详细用法可以参见源码中的docs/index.pdf用户手册。
用法:$ valgrind [options] prog-and-args
常用选项说明:
(1)、--help:显示帮助信息;
(2)、--version:显示valgrind版本;
(3)、--tool=
(4)、--quiet:安静地运行,只打印错误信息;
(5)、--verbose:更详细的信息,增加错误数统计;
(6)、--trace-childer=no|yes:跟踪子线程;
(7)、--track-fds=no|yes:跟踪打开的文件描述;
(8)、--time-stamp=no|yes:增加时间戳到Log信息;
(9)、--log-fd=
(10)、--log-file=
(11)、--xml=yes:将错误信息以xml格式输出,只有memcheck可用;
(12)、--xml-file=
(13)、--error-limit=no|yes:如果错误太多,则停止显示新错误;
(14)、--error-exitcode=
(15)、--leak-check=no|summary|full:对发现的内存泄露给出的信息级别,只有memcheck可用。
安装Valgrind:
1. 通过命令直接安装:
sudo apt-get install valgrind
2. 通过源码安装:
(1)、从http://www.valgrind.org/downloads/current.html下载最新源码valgrind-3.11.0.tar.bz2 ;
(2)、解压缩valgrind-3.11.0.tar.bz2;
(3)、进入到valgrind-3.11.0目录;
(4)、依次执行:
./configure
make
sudo make install
使用举例:
测试代码test1.c如下,来自valgrid使用手册:
#include
void f(voidd)
{
int* x = malloc(10 * sizeof(int));
x[10] = 0; // problem 1: heap block overrun
// problem 2: memory leak -- x not freed
}
int main(void)
{
f();
return 0;
}
生成test1执行文件,执行:
gcc -g -o test1 test1.c
使用valgrind,执行:
valgrind --tool=memcheck --leak-check=yes ./test1
运行结果如图:
参考文献:
1. http://www.cnblogs.com/zhuyp1015/p/3901191.html
2. http://blog.csdn.net/iccome/article/details/12708563