利用linux的mtrace命令定位内存泄露(Memory Leak)

简介: 一谈到内存泄露, 多数程序员都闻之色变。 没错, 内存泄露很容易引入, 但很难定位。  以你我的手机为例(假设不经常关机), 如果每天泄露一些内存, 那么开始的一个星期, 你会发现手机好好的, 当内存泄露积累到一定程度,  那就是各种卡死了, 系统异常, 最后死机, 不得不重启。

  一谈到内存泄露, 多数程序员都闻之色变。 没错, 内存泄露很容易引入, 但很难定位。  以你我的手机为例(假设不经常关机), 如果每天泄露一些内存, 那么开始的一个星期, 你会发现手机好好的, 当内存泄露积累到一定程度,  那就是各种卡死了, 系统异常, 最后死机, 不得不重启。

        如果搞开发, 遇到内存泄露问题, 那就呵呵了。 你可能先得花好几天来复现问题(泄露积累), 然后需要花好几天来定位问题和修改问题, 然后又要花好几天来验证问题, 而且, 很有可能没法一次改好, 上述流程又要循环了。 确实挺苦逼的。

        我个人认为, 在内存泄露问题上, 主动预防比被动定位要划算得多, 但无论你怎么预防, 总有掉链子的时候, 所以, 有时候不得不去被动定位内存泄露。

 

        在本文中, 暂不谈论手机内存泄露问题的定位, 仅仅介绍一个有用的linux小命令:mtrace(memory trace), 它可以用来协助定位内存泄露。 搞开发的, 应该或多或少地听说过mtrace.

        下面, 我们来看看程序:

[cpp]  view plain  copy
 
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.         setenv("MALLOC_TRACE", "taoge.log", "1");  
  6.         mtrace();  
  7.   
  8.         int *p = (int *)malloc(2 * sizeof(int));  
  9.   
  10.         return 0;  
  11. }  

       有的朋友要说了, 一眼就能看出内存泄露啊。 但是, 当程序大了之后, 怎能仅仅依靠肉眼? 好, mtrace该出场了。

 

 

        编译:gcc -g -DDEBUG test.c   (千万要注意, -g不可漏掉, 否则, 虽然最后能定位到内存泄露, 但却找不到在代码的第几行。由于我代码中没有Debug宏控制, 所以编译时, -DDEBUG是可以省略的, 因此, 直接写成gcc -g test.c即可)

        运行:./a.out

        定位:mtrace a.out taoge.log

        结果:

       可以看到, 有内存泄露,且正确定位到了代码的行数。

 

       我们想一下mtrace函数/命令的原理, 其实也很简单, 无非就是记录每一对malloc/free的调用情况, 从这个意义上来讲, mtrace替代了部分我们的眼睛, 紧紧地盯着malloc/free, 所以能看到泄露还是不泄露啊。

 

 

       说明一下, 我的linux上并没有安装mtrace命令, 所以无法调试, 在网友Jukay的帮助下, 我才接触到shiyanlou这个优秀的在线工具, 地址是:https://www.shiyanlou.com/ , 大家不需要注册, 直接用QQ登录即可, 上面的过程就是在shiyanlou中做的。 没有linux环境的朋友们, 以后就可以在这上面玩了, 不要再扯理由说没有linux环境啦。 再次感谢Jukay介绍这么优秀的在线工具。

 

       OK,  本文先写到这里, 后续会继续介绍一些与linux有关的基本调试工具和方法。

 

目录
相关文章
|
11天前
|
Web App开发 Linux 网络安全
工作中常用到的Linux命令
工作中常用到的Linux命令
|
8天前
|
NoSQL Linux Shell
常用的 Linux 命令
常用的 Linux 命令
30 9
|
1天前
|
安全 Linux 开发工具
Linux中可引起文件时间戳改变的相关命令
【4月更文挑战第12天】Linux中可引起文件时间戳改变的相关命令
8 0
|
2天前
|
域名解析 网络协议 Linux
Linux 中的 Nslookup 命令怎么使用?
【4月更文挑战第12天】
20 6
Linux 中的 Nslookup 命令怎么使用?
|
3天前
|
JavaScript 前端开发
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 内存溢出问题
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 内存溢出问题
10 1
|
3天前
|
运维 网络协议 Unix
18.系统知识-Linux常用命令
18.系统知识-Linux常用命令
|
4天前
|
网络协议 Ubuntu Linux
Linux 下 TFTP 服务搭建及 U-Boot 中使用 tftp 命令实现文件下载
Linux 下 TFTP 服务搭建及 U-Boot 中使用 tftp 命令实现文件下载
|
4天前
|
Linux Go
Linux命令Top 100驱动人生! 面试必备
探索Linux命令不再迷茫!本文分10部分详解20个基础命令,带你由浅入深掌握文件、目录管理和文本处理。 [1]: <https://cloud.tencent.com/developer/article/2396114> [2]: <https://pan.quark.cn/s/865a0bbd5720> [3]: <https://yv4kfv1n3j.feishu.cn/docx/MRyxdaqz8ow5RjxyL1ucrvOYnnH>
48 0
|
7天前
|
缓存 运维 监控
Linux系统监控利器:探索常用命令及数据保存技巧
Linux系统监控利器:探索常用命令及数据保存技巧
23 4
Linux系统监控利器:探索常用命令及数据保存技巧
|
10天前
|
Linux 索引
linux 文件查找 和文件管理常用命令
linux 文件查找 和文件管理常用命令
19 0