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

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

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

确实挺苦逼的。工具

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


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

        如下, 咱们来看看程序:调试

#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就能够)code

        执行:./a.outblog

        定位:mtrace a.out taoge.logip

        结果:内存


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


       咱们想一下mtrace函数/命令的原理, 事实上也很是easy, 无非就是记录每一对malloc/free的调用状况, 从这个意义上来说, mtrace替代了部分咱们的眼睛, 牢牢地盯着malloc/free, 因此能看到泄露仍是不泄露啊。



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


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

相关文章
相关标签/搜索