利用mtrace检查内存泄漏
来源:互联网 发布:java调用kettle文件 编辑:程序博客网 时间:2024/04/25 12:26
mtrace是linux下检查内存泄漏的工具之一。
它实际上是通过一对函数来检测一段代码是否存在内存泄漏:
mtrace()与muntrace()。
它们的原型如下:
void mtrace(void);
void muntrace(void);
头文件为:mcheck.h
用法:
1. 首先确定需要检测那一段代码
2. 然后再在这段代码的前面调用mtrace(),在这段代码之后调用muntrace()。
3. 设置环境变量:MALLOC_TRACE,可以在程序编译好后通过命令:
export MALLOC_TRACE=./log //其中log是用来存放内存泄漏信息的日志文件名。
也可以在调用mtrace()之前调用函数设置环境变量:setenv("MALLOC_TRACE", "log", 1);
4. 编译并运行程序,这样内存泄漏信息就会写到log文件中。
5. 查看log文件,如:cat log
注意: 一般情况下不要调用muntrace, 而让程序自然结束. 因为可能有些释放内存代码要到muntrace之后才运行.
实例:
#include <stdio.h>
#include <error.h>
#include <mcheck.h>
int main(void)
{
setenv("MALLOC_TRACE", "log", 1); //设置环境变量MALLOC_TRACE
mtrace(); //在需要检测的代码段之前调用mtrace函数
char *str1 = (char*)malloc(10);
char *str2 = (char*)malloc(10);
if((NULL == str1) || (NULL == str2))
{
perror("can't allocate memory");
}
muntrace(); //在需要检测的代码段之后调用muntrace函数
return 0;
}
将上面的程序编译运行后会在当前目录下产生一个记录=内存泄漏的文件log,其内容如下:
(“+”表示申请的内存,“-”表示释放的内存)
= Start
@ ./test:[0x8048534] + 0x9ed1418 0xa
@ ./test:[0x8048542] + 0x9ed1428 0xa
= End
上面的信息表示:程序分配了两次内存,起内存地址分别是0x9ed1418和0x9ed1428;但并未释放,于是这段程序就存在内存泄漏。
现在我们在示例程序中加上一句:free(str1); 再编译运行后查看log如下:
= Start
@ ./test:[0x8048564] + 0x91ab418 0xa
@ ./test:[0x8048572] + 0x91ab428 0xa
@ ./test:[0x804859c] - 0x91ab418
= End
上面的信息表示:程序申请了两块内存0x91ab418和0x91ab428,但只释放了内存0x91ab418 。故也存在内存泄漏。
当然如果加上free(str1); 与free(str2);则log内容如下:
= Start
@ ./test:[0x8048564] + 0x809b418 0xa
@ ./test:[0x8048572] + 0x809b428 0xa
@ ./test:[0x804859c] - 0x809b418
@ ./test:[0x80485a4] - 0x809b428
= End
这表示申请的内存都释放掉了,故不存在内存泄漏。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gogor/archive/2009/09/03/4515131.aspx
- 利用mtrace检查内存泄漏
- 利用mtrace检查内存泄漏
- 利用mtrace检查内存泄漏
- mtrace检查内存泄漏
- mtrace检查内存泄漏
- mtrace检查内存泄漏
- 用mtrace检查内存泄漏
- 用mtrace检查内存泄漏
- linux中用mtrace 检查内存泄漏
- 使用mtrace进行内存泄漏检查
- mtrace 跟踪内存泄漏
- mtrace内存泄露检查
- 使用mtrace检查内存溢出
- 使用mtrace检查内存溢出
- 用mtrace检查内存泄露
- 使用mtrace检查内存溢出
- 利用CRT库函数检查内存泄漏
- 利用 LeakCanary 来检查 Android 内存泄漏
- window.scrollTo(1210,1120);
- 冒泡排序、堆排序等常用算法总结
- solaris自带snoop抓包工具
- OSGi控制台在Eclipse插件开发中的妙用
- [openstack swift] Swift Architectural Overview
- 利用mtrace检查内存泄漏
- 【专题】软件测试缺陷管理大揭秘
- Eclipse快捷键大全
- linux中的线程和信号
- C/C++内存泄露--工程中如何尽量避免
- VC导出类
- HTML 5:富媒体时代的Web内容新规范,你准备好了吗?
- 食盐抢购风波,抽的是谁的脸?
- C++ 文件长度 文件buffer