利用linux的mtrace命令定位内存泄露(Memory Leak)
一谈到内存泄露, 多数程序猿都闻之色变。 没错, 内存泄露非常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)的更多相关文章
- SQL Server 内存泄露(memory leak)——游标导致的内存问题
原文:SQL Server 内存泄露(memory leak)--游标导致的内存问题 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/07/01/sql ...
- 内存溢出(Oom)和内存泄露(Memory leak)
1.概念 内存溢出(Oom):1.内存不够用:2.数据长度短的数据类型存储了一个数据长度较大的数据类型:3.一个结果 内存泄露(Memory leak):1.忘记释放已用内存,内存管理较为常见的现象: ...
- 使用JProfiler分析定位java内存泄露memory leak
使用jprofiler远程profile JBoss应用服务器 项目中发现JBoss出现内存泄露, 从2G一直涨到3.5G左右 开始考虑使用jmap dump出内存来, 在用jhap打开浏览器分析. ...
- 内存溢出(Memory Overflow)和内存泄露(Memory Leak)的区别
内存泄漏指你用malloc或new申请了一块内存,但是没有通过free或delete将内存释放,导致这块内存一直处于占用状态 内存溢出指你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数 ...
- python内存泄露memory leak排查记录
问题描述 A服务,是一个检测MGR集群主节点是否发生变化的服务,使用python语言实现的. 针对每个集群,主线程会创建一个子线程,并由子线程去检测.子线程会频繁的创建和销毁. 上线以后,由于经常会有 ...
- Java 基础 - 内存泄露Memory leak & 内存溢出Out of memory
内存泄露 & 内存溢出 关系 https://www.cnblogs.com/panxuejun/p/5883044.html 内存泄露的6种情况: https://blog.csdn.net ...
- 内存泄露 memory leak 的原因
#include <iostream> using namespace std; void foo() { MyClass *x; x = new MyClass(); //指向的丢失了 ...
- Android 内存管理 &Memory Leak & OOM 分析
转载博客:http://blog.csdn.net/vshuang/article/details/39647167 1.Android 进程管理&内存 Android主要应用在嵌入式设备当中 ...
- 内存泄漏(Memory Leak)
什么情况下会导致内存泄露(Memory Leak)? Android 的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M.因此我们所能利用 的内存空间是有限的.如果我们的 ...
随机推荐
- 高效遍历匹配Json数据与双层for循环遍历Json数据
工作中往往遇到这种情况,保留用户操作痕迹,比如用户选择过得东西,用户进入其它页面再返回来用户选择的的数据还在. 比如:1.购物车列表中勾选某些,点击任意一项,前往详情页,再返回购物车依旧需要呈现勾选状 ...
- Flutter开发环境(Window)配置及踩坑记录
Flutter 是 Google 用以帮助开发者在 iOS 和 Android 两个平台开发高质量原生 UI 的移动 SDK.Flutter 兼容现有的代码,免费且开源,在全球开发者中广泛被使用. F ...
- BZOJ.2707.[SDOI2012]走迷宫(期望 Tarjan 高斯消元)
题目链接 一个点到达终点的期望步数 \(E_i=\sum_{(i,j)\in G}\frac{E_j+1}{out[i]}\),\(out[i]\)为点\(i\)的出度. 那么对于一个DAG可以直接在 ...
- BZOJ.5417.[NOI2018]你的名字(后缀自动机 线段树合并)
LOJ 洛谷 BZOJ 考虑\(l=1,r=|S|\)的情况: 对\(S\)串建SAM,\(T\)在上面匹配,可以得到每个位置\(i\)的后缀的最长匹配长度\(mx[i]\). 因为要去重,对\(T\ ...
- 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]\)中有 ...
- Sql Server 修改表所属用户
Sql Server 修改表所属用户 exec sp_changeobjectowner 'tablename','dbo' tablename--所要修改的表明 dbo--是表所属的用户,默认是db ...
- 把url的参数解析出来
https://zhidao.baidu.com/question/455797151306205205.html
- C、C++、C#、Java、php、python语言的内在特性及区别
C.C++.C#.Java.PHP.Python语言的内在特性及区别: C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作 ...
- mac pro 如何让终端默认运行python3.X而不是2.7
Mac版本的Python默认是2.7,安装高版本后需要修改为你安装的版本. 1,首先打开终端 open ~/.bash_profile 打开配置文件 2. 写入python的外部环境变量(本人的版本是 ...
- C++中int与string的相互转换【转】
一.int转string 1.c++11标准增加了全局函数std::to_string: string to_string (int val); string to_string (long val) ...