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

假设搞开发。 遇到内存泄露问题, 那就呵呵了。 你可能先得花好几天来复现问题(泄露积累), 然后须要花好几天来定位问题和改动问题, 然后又要花好几天来验证问题, 并且。 非常有可能没法一次改好, 上述流程又要循环了。

确实挺苦逼的。

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

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

以下, 我们来看看程序:

#include <stdio.h>

int main()
{
setenv("MALLOC_TRACE", "taoge.log", "1");
mtrace(); int *p = (int *)malloc(2 * sizeof(int)); return 0;
}

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

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

执行:./a.out

定位:mtrace a.out taoge.log

结果:

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

我们想一下mtrace函数/命令的原理, 事实上也非常easy, 无非就是记录每一对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. 内存溢出(Oom)和内存泄露(Memory leak)

    1.概念 内存溢出(Oom):1.内存不够用:2.数据长度短的数据类型存储了一个数据长度较大的数据类型:3.一个结果 内存泄露(Memory leak):1.忘记释放已用内存,内存管理较为常见的现象: ...

  3. 使用JProfiler分析定位java内存泄露memory leak

    使用jprofiler远程profile JBoss应用服务器 项目中发现JBoss出现内存泄露, 从2G一直涨到3.5G左右 开始考虑使用jmap dump出内存来, 在用jhap打开浏览器分析. ...

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

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

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

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

  6. Java 基础 - 内存泄露Memory leak & 内存溢出Out of memory

    内存泄露 & 内存溢出 关系 https://www.cnblogs.com/panxuejun/p/5883044.html 内存泄露的6种情况: https://blog.csdn.net ...

  7. 内存泄露 memory leak 的原因

    #include <iostream> using namespace std; void foo() { MyClass *x; x = new MyClass(); //指向的丢失了 ...

  8. Android 内存管理 &Memory Leak & OOM 分析

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

  9. 内存泄漏(Memory Leak)

    什么情况下会导致内存泄露(Memory Leak)? Android 的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M.因此我们所能利用 的内存空间是有限的.如果我们的 ...

随机推荐

  1. 高效遍历匹配Json数据与双层for循环遍历Json数据

    工作中往往遇到这种情况,保留用户操作痕迹,比如用户选择过得东西,用户进入其它页面再返回来用户选择的的数据还在. 比如:1.购物车列表中勾选某些,点击任意一项,前往详情页,再返回购物车依旧需要呈现勾选状 ...

  2. Flutter开发环境(Window)配置及踩坑记录

    Flutter 是 Google 用以帮助开发者在 iOS 和 Android 两个平台开发高质量原生 UI 的移动 SDK.Flutter 兼容现有的代码,免费且开源,在全球开发者中广泛被使用. F ...

  3. BZOJ.2707.[SDOI2012]走迷宫(期望 Tarjan 高斯消元)

    题目链接 一个点到达终点的期望步数 \(E_i=\sum_{(i,j)\in G}\frac{E_j+1}{out[i]}\),\(out[i]\)为点\(i\)的出度. 那么对于一个DAG可以直接在 ...

  4. BZOJ.5417.[NOI2018]你的名字(后缀自动机 线段树合并)

    LOJ 洛谷 BZOJ 考虑\(l=1,r=|S|\)的情况: 对\(S\)串建SAM,\(T\)在上面匹配,可以得到每个位置\(i\)的后缀的最长匹配长度\(mx[i]\). 因为要去重,对\(T\ ...

  5. Codeforces.528D.Fuzzy Search(FFT)

    题目链接 \(Descripiton\) 给出文本串S和模式串T和k,S,T为DNA序列(只含\(A,T,G,C\)).对于S中的每个位置\(i\),只要\(s[i-k]\sim s[i+k]\)中有 ...

  6. Sql Server 修改表所属用户

    Sql Server 修改表所属用户 exec sp_changeobjectowner 'tablename','dbo' tablename--所要修改的表明 dbo--是表所属的用户,默认是db ...

  7. 把url的参数解析出来

    https://zhidao.baidu.com/question/455797151306205205.html

  8. C、C++、C#、Java、php、python语言的内在特性及区别

    C.C++.C#.Java.PHP.Python语言的内在特性及区别: C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作 ...

  9. mac pro 如何让终端默认运行python3.X而不是2.7

    Mac版本的Python默认是2.7,安装高版本后需要修改为你安装的版本. 1,首先打开终端 open ~/.bash_profile 打开配置文件 2. 写入python的外部环境变量(本人的版本是 ...

  10. C++中int与string的相互转换【转】

    一.int转string 1.c++11标准增加了全局函数std::to_string: string to_string (int val); string to_string (long val) ...