大型项目中的内存泄漏检测手段和方法

   大型项目中的内存泄漏检测手段和方法
    `  2008.0714  by `海风 ~   `


   记得曾在一个项目当中使用了某种内存检测方法(当时在项目经理的指导下),记得老大如是说:能运用在语言级别hack的方法可以提前检测出更多bug的发生(视乎具体语言的语法复杂度,C要比C++容易很多)。
   语言级别的hack,大部分情况下是指插桩,给出一份源码,在不修改源码的情况下,插入用于调测的桩代码(可以是宏或者二进制代码,甚至像purify那样链接自己实现的C库lib)。
   下面就内存检测的方法,提出几点建议:
   ① 保存所分配的指针地址和附加信息(用编译器提供的 __FILE__ 和 __LINE__ 宏来提供附加信息),用hash_table来保存和重新索引;(假如用链表保存分配过的指针地址,遍历链表将是很严重的性能瓶颈,当一秒内有超过千次的内存申请时,恐怕会影响到测试的效果);
   ② 为了达到不修改源码的目的(hack),尽管宏定义一般都是大写,不过这里用法特殊,建议别拘泥于编程风格。直接把malloc用宏定义来重载了(我们项目中甚至对new操作符也作了重载)。
   ③ 加入NDEBUG的宏定义,这样可以使这系列宏只在调试版本中应用,Release版本中自动用原版的malloc函数。
   ④ 记得要加锁,以适应多线程的运行环境下的可靠运行。(这个是根本,不能因为调试而引入新的问题)
   ⑤ 为动态获得报告结果,建议把检验的指针地址用信息报的方式(代替printf),jet 到127.0.0.1的一个服务端去(需另外写),然后随时随地可以用GUI的方式来呈现内存分配的动态情况(百分比),集中突显问题,甚至可找出内存分配的峰值在哪里。
   ⑥ 如果运行在Linux下,考虑与valgrind一起使用,尝试发现更多的内存泄漏问题。
   ⑦ 输出完整的内存分配(和释放)记录日志(在服务器上),并写一个简单的日志分析小工具协助静态分析内存泄漏状况。

   以上是当时项目进行时的实践经验,效果不错嘀,发现了平常很难发现的内存泄漏,而且由于调试版本与Release版本里内存申请速度相当,并没有引入额外的问题,为加快项目问题收敛率起到决定性的作用!!!


  --------------------------------------------------------

   对有些项目,某些分配的内存写过界的问题比较头疼, 是谁动了不属于自己使用的内存空间呢?
   有一个方法,叫做面包包围法(只用在调试版本和调试阶段),在某部分内存申请的时候,多分配一些(分别在内存的前和后,多少视乎情况而定),写入固定的某些值,如 全1 或 全7、全FF之类。然后,在程序的里加入一个调试函数用于验证该包围圈是否为预写入的那些值,把该函数放在认为可能发生误改写的地方,然后运行程序。
   当发生了程序误改写之后,我们可以把这称之为老鼠咬面包了,写下记录并保存日志和额外信息(如哪个文件、第几行),还有包围圈的里的信息内容。这样,看现场环境就可以猜出是什么老鼠来吃了我们的面包了。  呵呵  /cy
   在调试阶段结束后,记得一定要清除这些的代码! 这样的代码最好不要流入发行版本当中去。

   (完~)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值