前言
所有使用动态内存分配(dynamic memory allocation)的程序都有机会遇上内存泄露(memory leakage)问题,在Linux里有三种常用工具来检测内存泄露的情況,包括: mtrace
dmalloc
memwatch
. mtrace
mtrace是三款工具之中是最简单易用的,mtrace是一个C函數,在<mcheck.h>里声明及定义,函数原型为: void mtrace(void); 其实mtrace是类似malloc_hook的 malloc handler,只不过mtrace的handler function已由系统为你写好,但既然如此,系统又怎么知道你想将malloc/free的记录写在哪里呢?为此,调用mtrace()前要先设置 MALLOC_TRACE环境变量: #include <stdlib.h>
....
setenv("MALLOC_TRACE", "output_file_name", );
... 「output_file_name」就是储存检测结果的文件的名称。 但是检测结果的格式是一般人无法理解的,而只要有安装mtrace的话,就会有一名为mtrace的Perl script,在shell输入以下指令: mtrace [binary] output_file_name 就会将output_file_name的內容转化成能被理解的语句,例如「No memory leaks」,「0x12345678 Free was never alloc」诸如此类。 例如以下有一函数:(暂且放下single entry single exit的原则) #include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <mcheck.h>
int main() {
char *hello; setenv("MALLOC_TRACE", "output", );
mtrace();
if ((hello = (char *) malloc(sizeof(char))) == NULL) {
perror("Cannot allocate memory.");
return -;
} return ;
} 执行后,再用mtrace 将结果输出: - 0x08049670 Free was never alloc'd 0x42029acc
- 0x080496f0 Free was never alloc'd 0x420dc9e9
- 0x08049708 Free was never alloc'd 0x420dc9f1
- 0x08049628 Free was never alloc'd 0x42113a22
- 0x08049640 Free was never alloc'd 0x42113a52
- 0x08049658 Free was never alloc'd 0x42113a96 Memory not freed:
-----------------
Address Size Caller
0x08049a90 0x1 at 0x80483fe 最后一行标明有一个大小为1 byte的内存尚未释放,大概是指「hello」吧。 若我们把该段内存释放: #include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <mcheck.h>
int main() {
char *hello; setenv("MALLOC_TRACE", "output", );
mtrace();
if ((hello = (char *) malloc(sizeof(char))) == NULL) {
perror("Cannot allocate memory.");
return -;
} free(hello);
return ;
} 结果如下: - 0x080496b0 Free was never alloc'd 0x42029acc
- 0x08049730 Free was never alloc'd 0x420dc9e9
- 0x08049748 Free was never alloc'd 0x420dc9f1
- 0x08049668 Free was never alloc'd 0x42113a22
- 0x08049680 Free was never alloc'd 0x42113a52
- 0x08049698 Free was never alloc'd 0x42113a96
No memory leaks. mtrace的原理是记录每一对malloc-free的执行,若每一个malloc都有相应的free,则代表没有内存泄露,对于任何非malloc/free情況下所发生的内存泄露问题,mtrace并不能找出来。

最新文章

  1. Coming
  2. PCA数据降维
  3. 1472. Martian Army
  4. jquery选择器总结 转自(永远的麦子)
  5. 如果我用C#来输出99表
  6. 一个int类型究竟占多少个字节
  7. 有感PMI Exam Dev Workshop
  8. 下载xcode 6 beta.dmg
  9. 【Xilinx-VDMA模块学习】-01- VDMA IP的GUI配置介绍
  10. LinkBar选中项字体颜色
  11. Adobe After Effect CC2017 for Mac
  12. BZOJ4817 SDOI2017 相关分析
  13. Java 平时作业五
  14. 1. node.js 认识 (一)
  15. swust oj 1068
  16. js的==和===练习
  17. python算法双指针问题:使用列表和数组模拟单链表
  18. MySQL数据类型--与MySQL零距离接触2-8查看数据表
  19. git中 .ignore文件的配置 忽略不想上传的文件
  20. json ubuntu下安装

热门文章

  1. IDEA中文出现乱码解决
  2. springboot-vue项目后台1
  3. 连接池Connection timed out
  4. FANCO工程机械云平台
  5. MongoDB的Find详解(一)
  6. Go Concurrency or Parallel
  7. Go HelloWorld 网络版和并发版
  8. ubuntu中如何添加IP
  9. 【转载】Java类加载原理解析
  10. [kuangbin带你飞]专题十 匹配问题 一般图匹配