如何定位内存泄漏( 三 )


建议
【如何定位内存泄漏】一般公司都会封装malloc、new函数,并分配一个模块号,每个内存地址头部都会携带id号,如下:
xxx_malloc(int nModleID,size_t size);这样通过地址空间头也可以找到分配的模块 。

  • 分配次数
大小0x14的内存在90天时间内总共分配了23acbbe 次,0x23acbbe = 37407678/(90(天)*24(小时) ≈ 17318次/小时 。这个内存几乎每小时被申请17318次 。进程有个统计功能:每个小时会统计处理的消息类型次数,那分析下数量级在1w~3w左右的消息即可,大概是4个消息类型,然后通过对这四个代码review才发现内存泄漏点 。
if(total_fee){LPADD_FEE pAddFee = new ADD_FEE;ZeroMemory(pAddFee, sizeof(ADD_FEE));pAddFee->nFee = total_fee;gdt.nTotalFee = total_fee;}结构体 ADD_FEE ,刚好是20字节
typedef struct _tagADD_FEE{int nFee;int nReserved[4];}ADD_FEE, *LPADD_FEE;完全符合!! 问题解决
总结这是一个低级错误导致的 。为了避免类视问题,引入代码静态检测
1)、cppcheck
2)、pclint
最后选了pclint 。配合jenkins,每天凌晨进行代码静态检查,并输出和上个版本的diff文件,下次就不会出现这么低级的问题 。
在大公司里面都会有非常多的检测工具、流程、方法论,都是前人经验的积累,虽然有点冗余繁琐,但却非常有效 。当你离开这个平台后,缺少了这些流程,一旦遇到疑难问题你才发现自己能用的手段真的很少 。




推荐阅读