您的位置:首页 > 其它

利用mtrace检查内存泄漏

2007-05-08 23:44 316 查看
大家都知道,内存泄漏是每一个程序员和公司最关注的问题。因为此问题可以说是一个定时炸弹且不容易发现。
在华为等一些著名的软件公司都十分注意和关心这个问题。一次在听华为一个驱动组的主管的讲座时,他多次的有意识的提到了这个问题,也再次证明了越是经验丰富的老开发人员越关心内存这块雷区,但我们最常去的地方恰恰也就是这块雷区了。

最近可能是我们主管在参加什么翻译国外技术书籍(不知道他是否要出书呢,唉,以后逛书店大家真的要好好挑一下书了)。没事就会问我一些奇怪的技术问题,不过,今天这个问题我还是比较有兴趣的,是一个检查内存泄漏的东东,自己研究了一下,感觉还是比较好用的,推荐给大家,希望以后大家都写出安全的漂亮的代码。

正文:
[在代码中的概貌]
#include <mcheck.h> /* 要包含它 */

mtrace();
...
/* 要检查是否会有内存泄露的代码段; */
...
muntrace();

[代码编好后,在命令行下编译我们的代码]
[step1]
#gcc main.c -o main

[step2]
/* The environment variable MALLOC_TRACE defines a file where mtrace() writes its output.
* 用MALLOC_TRACE这个环境变量来定义一个文件log用于输出;
*/
#export MALLOC_TRACE=./log

[step3]
#./main

[step4]
#cat log

下面这个是用系统的命令来看内存泄漏信息
[更易懂的格式]
#mtrace --help /* 自己help一下,这个命令很简单地 */

P.S. 其实更好用的是你完全可以仅仅编译,而不用连接生成一个ELF文件,就可以检查内存泄漏的信息了。
e.g: #gcc -c main.c -o main.o
我的理解是其实这个命令就是在代码被编译,连接后从.txt段中来看malloc和free是否配对了。原来自己也傻忽忽的
写过检查自己代码是否有内存泄漏的一个小函数,当时印象中就是看其是否配对。现在才知道,原来这种常用的大家都关注的问题早有工具了。以后不能闭门造车了的说。
(如果你还不理解一段代码是如何变成一个计算机可以认识的二进制的程序的,建议你看看我原来的一篇文章,名字貌似叫“深入理解程序生成过程”,自己找找吧,我比较懒)

[下面是自己写的一段小实例代码,你可以COPY过去,来玩一下mtrace]




/**//*********************************************************************************************************


* FileName: main.c


*


* Author: Version : Date(Y/M/D):


* Li Yang Alpha 1.0 2007-05-08


*


* Description: The routine is a simple example,which check the memory lack with "mtrace".


*


**********************************************************************************************************/


#include <stdio.h>


#include <stdlib.h>


#include <mcheck.h>






void foo(char *p)




...{


printf("Invoke foo function to free memory pointer-p2 ");


free(p);


}




int main()




...{


int *p1;


char *p2;




mtrace();




p1 = (int *)malloc(4);


p2 = (char *)malloc(1);




printf("***Before free*** ");


printf("p1:[%p] ", p1);


printf("p2:[%p] ", p2);




free(p1);


// foo(p2); /* 将此代码注掉后,会产生内存泄漏 */




printf("***After free*** ");


printf("p1:[%p] ", p1);


printf("p2:[%p] ", p2);




muntrace();




return 0;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: