一谈到内存泄露, 多数程序猿都闻之色变。 没错, 内存泄露非常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. GitHub安装教程

    第一步是安装两个软件 安装 git for windows这个是一个git的windows系统的命令行版本https://git-scm.com/downloads或者https://pan.baid ...

  2. 键盘键码Key Code

    来源:https://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes Key Code backspace 8 t ...

  3. metasploit常见服务的漏点扫描模块

    弱点扫描 根据信息收集结果搜索漏洞利用模块 结合外部漏洞扫描系统对大IP地址段进行批量扫描 可以考虑对单个ip,单个服务进行扫描 NVC 密码破解端口:5900use auxiliary/scanne ...

  4. docker使用dockerfile 构建redis镜像

    FROM redis WORKDIR /data VOLUME /data EXPOSE RUN echo "success---------success" ENTRYPOINT ...

  5. Excel获取第一个表名

    Excel.Worksheet wsheet1 = (Excel.Worksheet)excelSql.Worksheets.get_Item(); wsheet1.Name获取sheet名称

  6. 你还在为无法完美卸载SQL Server 2008 R2而烦恼吗?

    你还在为无法完美卸载SQL Server 2008 R2而烦恼吗? 本文摘抄来自:http://blog.csdn.net/u013058618/article/details/50265961  小 ...

  7. BZOJ.2724.[Violet 6]蒲公英(静态分块)

    题目链接 区间众数 强制在线 考虑什么样的数会成为众数 如果一个区间S1的众数为x,那么S1与新区间S2的并的众数只会是x或S2中的数 所以我们可以分块先预处理f[i][j]表示第i到第j块的众数 对 ...

  8. [TJOI2018]异或

    Description: 现在有一颗以1为根节点的由n个节点组成的树,树上每个节点上都有一个权值v ​现在有Q次操作,操作如下: 1.1 x y :查询节点x的子树中与y异或结果的最大值 2.2 x  ...

  9. bzoj 4084 双旋转字符串

    给两个集合A,B,找满足要求的(a,b)的对数,可以计算对于a,哪些b成立. 还有就是字符串hash的使用,感觉平时用字符串hash太少了. /**************************** ...

  10. BZOJ3682 Phorni 后缀平衡树

    后缀平衡树的裸题 后缀平衡树简单的思想如下 具体的可以去看$clj$的论文 假设我们已经有了串$S$的后缀平衡树 插入一个字母$c$ 我们用$Si$代表原串$S$从第$i$个字符开始的后缀 则后缀$c ...