1 前言

mtrace(memory trace),是 GNU Glibc 自带的内存问题检测工具,它可以用来协助定位内存泄露问题。它的实现源码在glibc源码的malloc目录下,其基本设计原理为设计一个函数 void mtrace (),函数对 libc 库中的 malloc/free 等函数的调用进行追踪,由此来检测内存是否存在泄漏的情况。


2 使用方式

2.1 修改源码

在使用之前,需要修改我们的源码,用来跟踪内存分配和释放,其中需要使用两个函数

#include <mcheck.h>

/* 开启内存分配跟踪 */
void mtrace(void); /* 取消内存分配跟踪 */
void muntrace(void);

mtrace() 函数中会为那些和动态内存分配有关的函数(譬如 malloc()、realloc()、memalign() 以及 free())安装 “钩子(hook)” 函数,这些 hook 函数会为我们记录所有有关内存分配和释放的跟踪信息,而 muntrace() 则会卸载相应的 hook 函数。基于这些 hook 函数生成的调试跟踪信息,我们就可以分析是否存在 “内存泄露” 这类问题了。

例如:

#include <mcheck.h>
#include <stdlib.h>
#include <stdio.h> int main(int argc, char **argv)
{
mtrace(); // 开始跟踪 char *p = (char *)malloc(100); free(p);
p = NULL; p = (char *)malloc(100); muntrace(); // 结束跟踪,并生成日志信息 return 0;
}

从上述代码中,我们希望能够在程序开始到结束检查内存是否泄漏的问题,例子简单,一眼就能看出存在内存泄漏的问题,所以我们需要验证 mtrace 是否能够检查出来内存泄漏问题,且检查的结果如何分析定位。

2.2 编译源码

编译修改后的源码,生成可执行文件(一定加上 -g 参数选项,能够帮我们定位代码中的具体位置,否则看到的只是执行文件中的地址信息)

gcc -g test.c -o test

2.3 设置日志生成路径

mtrace 机制需要我们实际运行一下程序,然后才能生成跟踪的日志,但在实际运行程序之前还有一件要做的事情是需要告诉 mtrace (即前文提到的 hook 函数)生成日志文件的路径。具体的方法是通过定义并导出一个环境变量 "MALLOC_TRACE",如下所示。

export MALLOC_TRACE=./test.log  // 当前目录下

2.4 运行程序

./test

程序运行结束,会在当前目录生成 test.log 文件,打开可以看到一下内容:

= Start
@ ./test:[0x400624] + 0x21ed450 0x64
@ ./test:[0x400634] - 0x21ed450
@ ./test:[0x400646] + 0x21ed450 0x64
= End

从这个文件中可以看出中间三行分别对应源码中的 malloc -> free -> malloc 操作;解读:./test 指的是我们执行的程序名字,[0x400624] 是第一次调用 malloc 函数机器码中的地址信息,+ 表示申请内存( - 表示释放),0x21ed450 是 malloc 函数申请到的地址信息,0x64 表示的是申请的内存大小。由此分析第一次申请已经释放,第二次申请没有释放,存在内存泄漏的问题。


3 分析定位

通过上面的日志简单分析确定存在内存泄漏,但是程序不可能这么简单,如果按上述去分析,得累死,因此通过下面的方式可快速定位。

3.1 定位源码所在行数

通过使用 "addr2line" 命令工具,得到源文件的行数(通过这个可以根据机器码地址定位到具体源码位置)。

# addr2line -e test 0x400624
/home/const/workspace/memtest/test.c:9

3.2 分析内存泄漏

上述指令仅仅只是可以定位源码位置,但是没法分析存在内存泄漏的问题,因此需要通过下述指令分析日志信息(mtrace + 可执行文件路径 + 日志文件路径)。

# mtrace test ./test.log

Memory not freed:
-----------------
Address Size Caller
0x00000000021ed450 0x64 at /home/const/WorkSpace/memtest/test.c:14

内存泄漏定位工具之 mtrace(一)的更多相关文章

  1. 内存泄漏定位工具之 valgrind 使用

    1 前言 前面介绍了 GCC 自带的 mtrace 内存泄漏检查工具,该篇主要介绍开源的内存泄漏工具 valgrind,valgrind 是一套 Linux 下,开放源代码的动态调试工具集合,能够检测 ...

  2. Cocos开发中性能优化工具介绍之Visual Studio内存泄漏检测工具——Visual Leak Detector

    那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测功能,我们可以使用第三方工具Visual Leak Detector(以下简 ...

  3. C++内存泄漏检测工具

    C++内存泄漏检测工具 1.VC自带的CRT:_CrtCheckMemory   调试器和 CRT 调试堆函数 1.1用法: /************************************ ...

  4. 构造函数,C++内存管理,内存泄漏定位

    构造函数 1.构造顺序 虚基类构造函数,基类构造函数,类对象构造函数,自己的构造函数 2.必须使用初始化列表 (1) 引用成员,常量成员: (2) 基类没默认构造函数(自己重载覆盖了), (3)类对象 ...

  5. 内存泄漏分析工具tMemMonitor (TMM)使用简介

    C/C++由于灵活.高效的优点一直以来都是主流的程序设计语言之一,但是其内存的分配与释放均由程序员自己管理,当由于疏忽或错误造成程序未能释放不再使用的内存时就会造成内存泄漏.在大型.复杂的应用程序中, ...

  6. C/C++的内存泄漏检测工具Valgrind memcheck的使用经历

    Linux下的Valgrind真是利器啊(不知道Valgrind的请自觉查看参考文献(1)(2)),帮我找出了不少C++中的内存管理错误,前一阵子还在纠结为什么VS 2013下运行良好的程序到了Lin ...

  7. android 内存泄漏检测工具 LeakCanary 泄漏金丝雀

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 内存泄漏检测工具 android 内存泄漏检测工具 ======== 内存泄漏 就是  无用的对 ...

  8. Cocos性能优化工具的开发介绍Visual Studio内存泄漏检测工具——Visual Leak Detector

    然后,Windows下有什么好的内存泄漏检測工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检測功能.我们能够使用第三方工具Visual Leak Detector(下面简 ...

  9. 介绍两个非常好用的Javascript内存泄漏检测工具

    内存泄漏对开发者来说一般很难检测因为它们是由一些大量代码中的意外的错误引起的,但它在系统内存不足前并不影响程序的功能.这就是为什么会有人在很长时间的测试期中收集应用程序性能指标来测试性能. 最简单的检 ...

  10. 内存泄漏检测工具VLD在VS2010中的使用举例

    Visual LeakDetector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.它的特点有:(1).它是免费开源的,采用LGPL协议:(2).它可以得到内存泄露点的调用堆栈,可 ...

随机推荐

  1. uni-app返回上一级,页面不刷新,bug

    uniapp 生命周期(onLoad跟onLoadonShow的区别) 一.uniapp生命周期分两种 : 1.应用生命周期:仅可在App.vue中监听,在其它页面监听无效. 2.页面生命周期:仅在p ...

  2. 云网络智慧课堂-Qt程序代码开发规范

    序言: 编程规范可以提升代码可读性,提高可维护性. 目录: 一.命名规范 二.内存管理规范 三.函数方法规范 四.控制语句规范 五.注释规范 六.排版规范 七.版本管理规范 八.界面编程 词义解释:强 ...

  3. 每天学五分钟 Liunx 011 | sudo

    回顾前两节,在 001 中介绍了怎么添加用户及用户组,在 010 中介绍了从 client 端 ssh 到 server 的详细过程,那么接下来要介绍的就是是登陆到 server 之后如何切换用户了. ...

  4. css - 使用 " dl、dt、dd " 描述列表的形式 , 实现 【图片加下方文字】 的快速布局

    上效果图 : 上代码 : <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  5. [转帖]OS、PFS、DFS 有啥区别?一文搞懂 6 大临床试验终点

    https://oncol.dxy.cn/article/670607 说到肿瘤临床研究,就不得不说临床试验终点(End Point),比如大家熟知的 OS.PFS.ORR 还有 DFS.TTP.TT ...

  6. [转帖]SQL Server 性能调优

      性能调优2:CPU   关系型数据库严重依赖底层的硬件资源,CPU是服务器的大脑,当CPU开销很高时,内存和硬盘系统都会产生不必需要的压力.CPU的性能问题,直观来看,就是任务管理器中看到的CPU ...

  7. [转帖]tidb RESTORE

    https://docs.pingcap.com/zh/tidb/v4.0/sql-statement-restore RESTORE 语句用于执行分布式恢复,把 BACKUP 语句生成的备份文件恢复 ...

  8. [转帖]SIMD指令集 SSE/AVX

    SIMD指令集 SSE/AVX 概述 参考手册 Intel Intrinsics Guide Tommesani.com Docs Intel 64 and IA-32 Architectures S ...

  9. [转帖]PG-用户|角色管理

    https://www.cnblogs.com/binliubiao/p/14415203.html 1. 角色 ​ 决定发起连接的命令的初始访问权限.在PG中,角色和用户相当于是一样的对象.区别在于 ...

  10. [转帖]JMeter学习(二)搭建骨架--JMeter重要组件

    https://www.cnblogs.com/tian-yong/p/4460665.html JMeter的属性和变量 JMeter属性统一定义在jmeter.properties文件中.JMet ...