前言
所有使用动态内存分配(dynamic memory allocation)的程序都有机会遇上内存泄露(memory leakage)问题,在Linux里有三种常用工具来检测内存泄露的情況,包括:
- mtrace
- dmalloc
- memwatch
1. 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", 1);
...
「output_file_name」就是储存检测结果的文件的名称。
但是检测结果的格式是一般人无法理解的,而只要有安装mtrace的话,就会有一名为mtrace的Perl script,在shell输入以下指令:
mtrace [binary] output_file_name
就会将output_file_name的內容转化成能被理解的语句,例如「No memory leaks」,「0x12345678 Free 10 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", 1);
mtrace();
if ((hello = (char *) malloc(sizeof(char))) == NULL) {
perror("Cannot allocate memory.");
return -1;
}
return 0;
}
执行后,再用mtrace 将结果输出:
- 0x08049670 Free 3 was never alloc'd 0x42029acc
- 0x080496f0 Free 4 was never alloc'd 0x420dc9e9
- 0x08049708 Free 5 was never alloc'd 0x420dc9f1
- 0x08049628 Free 6 was never alloc'd 0x42113a22
- 0x08049640 Free 7 was never alloc'd 0x42113a52
- 0x08049658 Free 8 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", 1);
mtrace();
if ((hello = (char *) malloc(sizeof(char))) == NULL) {
perror("Cannot allocate memory.");
return -1;
}
free(hello);
return 0;
}
结果如下:
- 0x080496b0 Free 4 was never alloc'd 0x42029acc
- 0x08049730 Free 5 was never alloc'd 0x420dc9e9
- 0x08049748 Free 6 was never alloc'd 0x420dc9f1
- 0x08049668 Free 7 was never alloc'd 0x42113a22
- 0x08049680 Free 8 was never alloc'd 0x42113a52
- 0x08049698 Free 9 was never alloc'd 0x42113a96
No memory leaks.
mtrace的原理是记录每一对malloc-free的执行,若每一个malloc都有相应的free,则代表没有内存泄露,对于任何非malloc/free情況下所发生的内存泄露问题,mtrace并不能找出来。
相关推荐
linux 内存泄露排查文档。 介绍mtrace的使用。根据实际问题介绍如果定位问题。
内存溢出:Linux下用Mtrace来检查程序内存 溢出
LinuxC编程侦测记忆体溢出工具mtrace[参照].pdf
对于内存溢出之类的麻烦可能大家在编写指针比较多的复杂的程序的...其实Linux系统下有一个使用的工具可以帮忙来调试的,这就是Mtrace。Mtrace主要能够检测一些内存分配和泄漏的失败等。本文我们来学习一下它的用法。
对于嵌入式系统中运行的程序,一般来说程序启动的时候会分配很多内存,然后一直运行下去,不会显式释放这些内存,这部分内存并不会导致内存泄露,所以我们并不关心它们,而更关心程序初始化之后继续运行过程中有没有...
rpm -ivh glibc-utils-2.9-2.i386 使用时候: [root@zzt]$export MALLOC_TRACE=mytrace.log [root@zzt]$ gcc testmtrace.c -o testmtrace [root@zzt]$./testmtrace [root@zzt]$ mtrace testmtrace mytrace.log
节点的本机内存跟踪和mtrace日志解析。 支持平台 仅Linux。 用法 使用npm install mtrace : npm install mtrace 生成一个mtrace: var mtrace = require ( 'mtrace' ) ; var filename = mtrace . mtrace ( ) ; if...
mtrace源码-MTrace FOSS
嵌入式系统下内存泄漏检查库函数mTrace以及测试代码,有详细使用文档.这个是将malloc和free 函数控制起来,检查内存.
mtrace 测试相关源码
mtrace使用.doc
mtrace可以用来 跟踪当前 系统/模块的内存 使用情况 ,以及估算系统/模块的占用内存的极值 , 系统/模块 卸载时的 内存 泄露情况。
More debugging hooks for `malloc .
一个可用在嵌入式上检查内存泄露的源代码工具
LINUX基本的程序调试技能及相关工具的使用,包括GDB(DDD)、Mtrace、strace等。
mtrace源码-MTrace FOSS.zip
改进的mtrace脚本,可以输出动态库中泄漏的行号信息。
分布式会话跟踪系统架构设计与实践 张志桐@美团点评基础架构中心 20160625 链路追踪(调用链路监控)最出名的是谷歌公开的...在复杂的微服务架构系统中,几乎每一个前端请求都会形成一个复杂的分布式服务调用链路。
-mtrace filename.mtr - 设置将写入数据内存访问跟踪的文件名。 内存访问文件 文件具有下一个结构: <operation> <size> 在哪里: <operation> - <operation> : l (加载)或s (存储) <size> - 请求块的...