利用mtrace检查内存泄漏
来源:互联网 发布:傲飞数据整合平台报错 编辑:程序博客网 时间:2024/04/20 01:35
大家都知道,内存泄漏是每一个程序员和公司最关注的问题。因为此问题可以说是一个定时炸弹且不容易发现。
在华为等一些著名的软件公司都十分注意和关心这个问题。一次在听华为一个驱动组的主管的讲座时,他多次的有意识的提到了这个问题,也再次证明了越是经验丰富的老开发人员越关心内存这块雷区,但我们最常去的地方恰恰也就是这块雷区了。
最近可能是我们主管在参加什么翻译国外技术书籍(不知道他是否要出书呢,唉,以后逛书店大家真的要好好挑一下书了)。没事就会问我一些奇怪的技术问题,不过,今天这个问题我还是比较有兴趣的,是一个检查内存泄漏的东东,自己研究了一下,感觉还是比较好用的,推荐给大家,希望以后大家都写出安全的漂亮的代码。
正文:
[在代码中的概貌]
#include <mcheck.h> /* 要包含它 */
#include <mcheck.h> /* 要包含它 */
mtrace();
...
/* 要检查是否会有内存泄露的代码段; */
/* 要检查是否会有内存泄露的代码段; */
...
muntrace();
muntrace();
[代码编好后,在命令行下编译我们的代码]
[step1]
#gcc main.c -o main
#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
* 用MALLOC_TRACE这个环境变量来定义一个文件log用于输出;
*/
#export MALLOC_TRACE=./log
[step3]
#./main
[step4]
#cat log
下面这个是用系统的命令来看内存泄漏信息
[更易懂的格式]
#mtrace --help /* 自己help一下,这个命令很简单地 */
#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;
}
* 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;
}
- 利用mtrace检查内存泄漏
- 利用mtrace检查内存泄漏
- 利用mtrace检查内存泄漏
- mtrace检查内存泄漏
- mtrace检查内存泄漏
- mtrace检查内存泄漏
- 用mtrace检查内存泄漏
- 用mtrace检查内存泄漏
- linux中用mtrace 检查内存泄漏
- 使用mtrace进行内存泄漏检查
- mtrace 跟踪内存泄漏
- mtrace内存泄露检查
- 使用mtrace检查内存溢出
- 使用mtrace检查内存溢出
- 用mtrace检查内存泄露
- 使用mtrace检查内存溢出
- 利用CRT库函数检查内存泄漏
- 利用 LeakCanary 来检查 Android 内存泄漏
- tagging file system + CMS构思
- 中了爱情毒药
- 每日 0day
- 大阪第52天——谁再跟我提日本产品质量好我跟谁急
- 07年初更新的JavaScript引擎在处理Microsoft DHTML Behaviors时存在BUG
- 利用mtrace检查内存泄漏
- 五一玩转辽宁之一 抚顺一日游
- 什么是商业智能?商业智能工具都有哪些?
- 商场三十六计——第7计 “无中生有”
- 商场三十六计——第8计 “暗渡陈仓”
- 求N之内的所有质数
- linux多线程编程──基本函数
- 收藏几个网址
- 数据仓库构建步骤