内存泄漏检测工具

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的源代码和文档可以参考以下网站:

http://dmalloc.com

 

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

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值