1. mtrace
它是一种最简单的内存泄漏跟踪工具。
可以探测由于不成对使用malloc/free函数调用引起的内存泄漏,通过GUN C库的函数调用mtrace()实现,可以打开跟踪并且创建分配和释放地址的日志文件。
通过一个perl脚本(也叫mtrace)显示日志文件,列出不成对malloc()发生的源代码行号。在linux下可以用于检查c和c++程序。mtrace具有可伸缩性的特点,它可以用来做全面的程序调试。
使用mtrace有3个方面最关键。
a.包含mcheck.h
b.设置MALLOC_TRACE环境变量
c.调用mtrace函数
2. dmalloc
它是替代malloc、realloc、calloc、free和其他内存管理函数的库。
dmalloc的特点提供了内存泄漏跟踪和越界检测功能.它可以报告出错的程序文件名、行号和一些通用的统计信息, 在运行时具有可配置性。
dmalloc可以配置包含线程支持和c++支持,能够作为共享库和静态库编译。所有这些选项在编译的时候选择,在链接应用程序的时候用到的这些库。
有一个头文件dmalloc.h需要包含在应用程序中,除了库和头文件,必须设置一个dmalloc读取的环境变量,用来配置配置如何检查和在哪里保存日志信息。
dmalloc测试程序使用的设置命令如下:
export DMALLOC_OPTIONS=debug=0x44a40503, inter=1, log=logfile
a. log是当前目录下的一个文件logfile
b. inter是库检查自己的频率为1
c. debug是选择检查类型的16进制数
如果库需要检查c++程序,还需要一个名为dmalloc.c的源文件。这个模块提供封装函数,把new转换成malloc,把delete转换成free.
dmalloc的源代码和文档可以参考以下网站:
3. memwatch
它是一种c语言内存错误检测工具,不仅能够探测malloc和free错误,而且能够探测越界(fencepost)情况。
当向一块分配的内存(通过malloc分配)并且数据超越分配区域的末端时,会发生越界的情况。也有memwatch不能捕捉到的情况:把数据写到已经释放的地址并且从外部分配的内存读取数据。
memwatch的核心是memwatch.c文件,它实现了封装和地址检查的代码。
使用memwatch前要做好以下准备:
a. 必须在源码中包含memwatch.h头文件
b.必须在编译命令行定义变量MEMWATCH(-DMEMWATCH)和MW_STDIO(-DMW_STDIO)
c. 必须和应用程序同时使用memwatch.c文件, memwatch.c生成的目标模块必须链接到应用程序中。
对于应用程序的执行,如果memwatch发现任何不正常,就会在标准输出上打印一行信息。创建文件memwatch.log文件存储出错信息,每一个错误信息包含出错的行号和源文件名。
memwatch支持ANSI C, 它提供结果日志记录,能检测双重释放(double-free)、错误释放(erroneous free)、没有释放的内存(unfreed memory)、溢出和下溢等等。
查看memwatch.log的日志,在内存地址改变导致分配区域的起始和结尾的重叠地方,memwatch工具能发现越界(fencepost)的情况。memwatch缺点是不能定制,它必须运行在整个应用程序上。
有一个测试程序test.c, 通过memwatch来测试这个程序:
gcc -DMEMWATCH -DMW_STDIO -o test test.c memwatch.c
更多的信息参考以下网站:
http://www.linkdata.se/sourcecode.html
4.YAMD
YAMD(Yet Another Malloc Debugger)是辅助查找C和C++程序中动态内存分配问题的工具包。
它具有以下特点:
a. 使用处理器的页面管理机制,确定分配内存块的边界
b. 每一步操作都会记录,不仅仅对文件和行号,还有完整的回溯
c. 在底层模拟"malloc"及其相关函数,可以跟踪其他非直接调用"malloc"的函数
d. 不需要修改应用程序源代码
e. 支持通用的内存调试功能
它的缺点是目前仅支持x86平台的linux系统。
可以从以下站点下载yamd的源代码:
http://www.cs.hmc.edu/~nate/yamd/yamd-0.32.tar.gz