读书人

施用vld检查内存泄露

发布时间: 2013-03-19 17:22:05 作者: rapoo

使用vld检查内存泄露
请看伪代码
#include "vld.h"
...

int main()
{
//step1:
// 给一些全局变量分配内存

//step2:
for(;;)
{/* 服务器的逻辑 */}

//step3:
// 释放全局变量分配的内存
}

问题:
由于这是个逻辑服务器进程,所以永远走不到step3,那我用vld怎么捕捉内存泄露信息呢?
我现在都是在step2的时候把程序关闭了,就是右上角的x按钮,vld会给我很多泄露信息,但是我怀疑不准确。
我自己做了一个实验,就是用上例的三部写个简单例子,如果在第二步关闭程序的话,vld是不会给出任何输出的。
实际上第二步很复杂,多线程的程序,还有底层的socket封装、继承,共享内存,lua脚本载入等等,不知道vld是不是因为用了什么奇怪的模块才会打出一些我觉得不准确的泄露情报。

求指教,我怎么来检查这个程序的这个内存泄露情况比较靠谱?
[解决办法]

引用:
引用:服务器正常关闭的时候,step3 完全不执行吗?那 step3 有什么用,没执行对应的释放,当然会报泄漏的。

服务器在第二步没有退出循环的可能,所以所谓正常关闭服务器,都不会走到第三步,我试过的,比如在第三步加入写入文件之类的代码,没有执行到。

而第三步释放的是全局变量申请的内存,它们本就应该在程序运行中一直存在,而我想检测……

我理解你的情况,但问题是 vld 估计没这么智能。它在系统过来收摊之前看一眼还有那些内存没释放,不可能去区分那些是放不放无所谓的内存,那些是真正需要 debug 的内存泄漏。然后成百上千的全打印出来,你怎么找有用的信息啊?可行的方法就是必须执行 step3 (甭管你是临时改一改,还是想什么歪招迫使程序执行 step3),这样那些疑似的内存泄漏就不会出现在 vld 的报告中了,剩下的(如果还有)才有用。
[解决办法]
汗, valgrind会让程序很慢,这一点你得搞明白。

正常跑到700M就不升了, 那一般是不会有泄露的。

挂valgrind做压力测试,内存基数本来就会高一些。

另外, 贴一下valgrind结果吧, 谁知道你说的泄漏到底是不是泄露
[解决办法]
引用:
引用:引用:
引用:服务器正常关闭的时候,step3 完全不执行吗?那 step3 有什么用,没执行对应的释放,当然会报泄漏的。

服务器在第二步没有退出循环的可能,所以所谓正常关闭服务器,都不会走到第三步,我试过的,比如在第三步加入写入文件之类的代码,没有执行到。
……

没用过 vld,不过这些内存泄露检测的软件都差不多,挂上以后运行程序都会很慢,有时候甚至原来的程序根本跑不动(感觉比 debug build 更慢),内存用量也会更大,cluster 上调程序更是指不上它们。所以我很少仰仗这些软件,一般都是 defensive programming,依赖 raii 这样的自动释放技术。

anyway,调内存泄露没什么太好的方法,最重要的就是细心(不要放过任何看似没问题的部分)和耐心(一个 bug 好几天很正常)。基本就是二分查找,就像你做的,一截一截注释排查代码。放开思路,别局限在常见的几种可能的错误类型中。比如,有时候指针强制类型转换错误,调用了错误的析构函数导致少执行了代码或者错误的成员函数覆盖了其他内存,也会引起泄露。

读书人网 >C++

热点推荐