本文仅限记录自己的一次 内存泄露追踪小记。 可能并不十分适用与大家的情况。而且方法也并不是很smart。仅做记录,能提供个思路更好。 

 
    一、 要问调试程序遇到什么问题最头疼, 内存泄露肯定能排在前几名里的。  内存泄露一般是由于 在申请、释放内存的过程中,并没有将其正确的结对使用。 出现了申请了内存,但是未释放或者少释放了内存的情况。   内存泄露问题的出现,可能短时间内不会造成很大的影响。但是如果长时间运行程序, 内存会被逐步蚕食殆尽。 而造成服务器(主机)工作异常的情况,严重的造成其他程序没法正常工作,甚至宕机的情况。
 
    二、遇到、发现内存泄露
    内存泄露的问题,肯定不是一眼就看出来的。这个一般是长期观察, 或者某种情况重复执行,并查看内存的使用情况,发现内存可用值逐步变少。而且停止该情况的执行后,内存使用率并不恢复。 此时, 出现内存泄露的问题的可能性就很大了。
 
    三、找到内存泄露的必要条件
    发现内存泄露了。最重要的是找到内存泄露的必要条件。最好是找到最一针见血的泄露条件。这个过程可能会比较长,如果情况较简单的话还好说。 几种条件试下来 基本上就能摸个差不多了! 但是如果碰到较复杂的情况,那么需要多钟条件组合测试。 得出最根本的那个导致泄露的条件,成功就不远了!
 
    四、找到内存泄露的代码
    有了问题必现的条件, 那么接下来就得跟代码了(废话。。。)。 根据条件的处理过程一点点缕代码, 查看内存的分配及释放情况。查看是否有少释放的情况。 不过这种方法是最笨的方法。
 
    (1)介绍一个工具valgrind,虽然在我的debug 阶段并未给予太大的帮助,而且还帮了点倒忙。但不妨碍要夸它是一款 很好的跟踪内存问题的工具。
 
    具体的使用方法可以参考 IBM 大神的文章 http://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/ 
 
    说说它的优点:
        不用向代码里特意插入新的跟踪代码。 仅在编译可执行程序时加入 -g 选项。 就可以使用valgrind 工具对其进行 内存调试啦。 方法还算简单些。
 
    但是有一点, 在我使用的程序中,是一个大循环。且是一个后台守护进程。  使用valgrind 就有点不方便了! 必现条件执行一次,非常之慢。。。 所以根据你的程序实际使用情况,甄别选用。如果没有其他思路的时候,可以使用该工具跑一下,没准就解决了呢!
 
    (2) 笨办法 在调用malloc/new, free/delete 等申请、释放内存的函数处,打印申请过程和一些基本信息(申请空间的大小,地址,也可以使用一个全局变量记下申请、释放的次数)。以便观察哪块有申请后,但没有找到对应的释放地方。
 
 
    总结来讲, 解决内存泄露没有非常便捷的办法。  预防方法就是规范自己的代码编写, 做好成对的申请与释放。 在处理异常情况返回、退出时记得释放之前申请的内存。养成编码的好习惯。   或者架构软件代码时,可以将内存申请、释放函数封装一下, 增加自己的调试信息进去。多一些必要的调试信息对解决问题有很大的帮助。
    出了内存泄露问题也不要太焦虑。没法快速解决问题也不要着急。 如果不是那种一眼就看出来就有泄露的地方, 基本上花费的时间都不会短。所以保持自己debug的热情,别气馁。  一般棘手问题的解决办法大多都是 缺了那么几行代码。找到解决办法后,也不要觉得自己菜鸟。 认为这么简单的问题花费了好长的时间 。 重要的是解决问题的过程。 每解决一个问题,你就进步了一次。

Linux 内存泄露小结的更多相关文章

  1. Linux内存分配小结--malloc、brk、mmap【转】

    转自:https://blog.csdn.net/gfgdsg/article/details/42709943 http://blog.163.com/xychenbaihu@yeah/blog/s ...

  2. linux 内存泄露 valgrind

    内泄漏工具 valgrind: https://linux.die.net/man/1/valgrind www.valgrind.org/docs/manual/index.html www.val ...

  3. linux 内存泄露检测工具

    Valgrind Memcheck 一个强大开源的程序检测工具 下载地址:http://valgrind.org/downloads/current.html Valgrind快速入门指南:http: ...

  4. Linux内存使用情况以及内存泄露分析之工具与方法

    <Linux C/C++ Memory Leak Detection Tool> 1. 内存使用情况分析 1.1 系统总内存分析 通过cat /proc/meminfo,可用的物理内存=M ...

  5. Linux内存使用情况以及内存泄露情况

    1. 内存使用情况分析 http://www.360doc.com/content/15/1118/13/17283_514054063.shtml https://www.linuxidc.com/ ...

  6. linux下内存泄露检测工具Valgrind介绍

    目前在linux开发一个分析实时路况的应用程序,在联合测试中发现程序存在内存泄露的情况. 这下着急了,马上就要上线了,还好发现了一款Valgrind工具,完美的解决了内存泄露的问题. 推荐大家可以使用 ...

  7. Linux kernel 内存泄露本地信息泄露漏洞

    漏洞名称: Linux kernel 内存泄露本地信息泄露漏洞 CNNVD编号: CNNVD-201311-467 发布时间: 2013-12-06 更新时间: 2013-12-06 危害等级:    ...

  8. linux下内存的统计和内存泄露类问题的定位

    在产品的开发中,通过对当前系统消耗内存总量的统计,可以对产品所需内存总量进行精确的评估,从而选择合适的内存芯片与大小,降低产品的成本.在遇到内存泄露类问题时,经常会对此束手无策,本文通过对proc下进 ...

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

    一谈到内存泄露, 多数程序猿都闻之色变. 没错, 内存泄露非常easy引入. 但非常难定位.  以你我的手机为例(如果不常常关机). 如果每天泄露一些内存, 那么開始的一个星期, 你会发现手机好好的. ...

随机推荐

  1. 最短路——spfa

    适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...

  2. JavaSE1

    <The Pragmatic Programmer><The Mythical Man-month><Clean Code><The Clean Coder& ...

  3. 路由跟踪工具0trace

    路由跟踪工具0trace   0trace是Kali Linuz自带的一个Shell脚本工具.该工具基于已建立的TCP连接,进行路由探测,实现侦查和防火墙穿透功能.使用时候,用户首先使用Telnet之 ...

  4. (bc 1001) hdu 6015 skip the class

    Skip the Class Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) T ...

  5. PHP 笔记——PDO操作数据库

    一.简介 ​ PHP 5.1可使用轻量级的统一接口 PDO(PHP Data Object,PHP数据对象)来访问各种常见的数据库.而使用PDO只需要指定不同的 DSN(数据源名称)即可访问不同的数据 ...

  6. bzoj1002 生成树计数 找规律

    这道题第一眼是生成树计数,n是100,是可以用O(n^3)的求基尔霍夫矩阵的n-1阶的子矩阵的行列式求解的,但是题目中并没有说取模之类的话,就不好办了. 用高精度?有分数出现. 用辗转相除的思想,让它 ...

  7. bzoj 1625: [Usaco2007 Dec]宝石手镯

    Description 贝茜在珠宝店闲逛时,买到了一个中意的手镯.很自然地,她想从她收集的 N(1 <= N <= 3,402)块宝石中选出最好的那些镶在手镯上.对于第i块宝石,它的重量为 ...

  8. python开发_textwrap文本样式

    在看python的API的时候,发现python的textwrap在处理字符串样式的时候功能强大 在这里我做了一个demo: textwrap提供了一些方法: wrap(text, width = 7 ...

  9. 把json格式的字符串转换成javascript对象或数组

      第一种 JSON.parse(jsonString) 第二种 eval("("+jsonString+")") 第三种 var obj=(function ...

  10. .Net 加密 哈希

    一.DES加解密 DES一共就有4个参数参与运作:明文.密文.密钥.向量.其中这4者的关系可以理解为: 密文=明文+密钥+向量: 明文=密文-密钥-向量: 为什么要向量这个参数呢?因为如果有一篇文章, ...