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

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

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

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

下面, 我们来看看程序:

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

有的朋友要说了, 一眼就能看出内存泄露啊。 但是, 当程序大了之后, 怎能仅仅依靠肉眼? 好, 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有关的基本调试工具和方法。

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

  1. SQL Server 内存泄露(memory leak)——游标导致的内存问题

    原文:SQL Server 内存泄露(memory leak)--游标导致的内存问题 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/07/01/sql ...

  2. 内存溢出(Memory Overflow)和内存泄露(Memory Leak)的区别

    内存泄漏指你用malloc或new申请了一块内存,但是没有通过free或delete将内存释放,导致这块内存一直处于占用状态 内存溢出指你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数 ...

  3. python内存泄露memory leak排查记录

    问题描述 A服务,是一个检测MGR集群主节点是否发生变化的服务,使用python语言实现的. 针对每个集群,主线程会创建一个子线程,并由子线程去检测.子线程会频繁的创建和销毁. 上线以后,由于经常会有 ...

  4. 性能优化之内存泄露(Memory Leak)常用分析工具(另3种)

    1 LeakCanary(最常用,能监控整个App内存泄漏情况) 1.1 使用LeakCanary // 仅在debug包启用LeakCanary debugImplementation 'com.s ...

  5. 什么是内存溢出(Out Of Memory---OOM)和内存泄露 (Memory Leak)

    1.内存溢出:(Out Of Memory---OOM) 系统已经不能再分配出你所需要的空间,比如系统现在只有1G的空间,但是你偏偏要2个G空间,这就叫内存溢出 例子:一个盘子用尽各种方法只能装4个果 ...

  6. Android 内存管理 Memory Leak OOM 分析

    转载博客:http://blog.csdn.net/vshuang/article/details/39647167 1.Android 进程管理&内存 Android主要应用在嵌入式设备当中 ...

  7. 一种定位内存泄露的方法(Linux)

    2019独角兽企业重金招聘Python工程师标准>>> 目的: 本文是<一种定位内存泄露的方法(Solaris)>对应的Linux版本,调试器使用gdb.主要介绍实例部分 ...

  8. Android Studio 选项菜单和动画结合_Android性能测试③-发现和定位内存泄露amp;卡顿...

    Android性能测试③-发现和定位内存泄露&卡顿 Android用户也许会经常碰到以下的问题: 1)应用后台开着,手机很快没电了--应用耗电大: 2)首次/非首次启动应用,进入应用特别慢-- ...

  9. 如何使用Eclipse内存分析工具定位内存泄露

    本文以我司生产环境Java应用内存泄露为案例进行分析,讲解如何使用Eclipse的MAT分析定位问题 一. 背景 11月10号晚上8点收到报警邮件,一看是OOM 打开公司监控系统查看应用各项指标发现J ...

最新文章

  1. CentOS 6.5安装python3.3.4
  2. 马斯克涨价推出完全自动驾驶FSD,放话“激光雷达即使免费也不用”
  3. 201521123060 《Java程序设计》第10周学习总结
  4. matlab在图片上显示文字颜色,科学网-解决matlab saveas printf保存图片时 colorbar中的字体颜色发生改变-肖鑫的博文...
  5. VTK:vtkArrayCalculator用法实战
  6. python re 正则表达式
  7. 無法在 module_path 中找出佈景主題引擎:‘clearlooks’,
  8. [翻译]运用文件解析器在任意文件中使用虚拟应用路径(~)
  9. [bzoj1059] [ZJOI2007]矩阵游戏
  10. 事件Event:带你体验鸿蒙轻内核中一对多、多对多任务同步
  11. react生命周期(自己的方式理解)
  12. Kafka 性能调优实战:同等资源配置性能提升 20 几倍的秘诀
  13. matlab m语言电路仿真,基于Matlab的TFT-LCD解码电路的仿真设计(含程序)
  14. TestNG Eclipse插件
  15. bzoj 3123 [Sdoi2013]森林
  16. NLPIR使用(1)
  17. 医学图像分割--U-Net: Convolutional Networks for Biomedical Image Segmentation
  18. vue+IOS9页面白屏
  19. 对java.lang.UnsupportedOperationException 异常的分析
  20. 快速破解IDEA(2017)

热门文章

  1. asp.net调用ajax实例
  2. JS内存泄漏实例解析
  3. 微信测试公众号-jssdk基本配置和使用-thinkphp
  4. 解决angularjs判断上传文件大小
  5. 屌丝也能开发安卓版2048(App Inventor)
  6. python学习笔记之列表(list)
  7. ConcurrentHashMap(转)
  8. Velocity 语法学习
  9. 实习日志(1)2011-12-30
  10. 64位Office 2010 连接SOHU IMAP服务器遇到问题