白盒测试 如何检测内存泄漏

恒温 · 2012年10月17日 · 最后由 天艮 回复于 2021年09月10日 · 4437 次阅读

微博上看到了一个关于内存泄漏的话题,大家梳理下内存泄漏的检测方法吧。

左耳朵耗子:用 C/C++ 的程序员,无论是资历有多老,总是一次又一次的和 Memory Leak 搏斗,搞 Memory Leak 和钓鱼一样,需要耐心。另,valgrind 不难用啊。STFG 吧。


@ 李遵举:后台多进程服务程序 rss 逐渐增大,过一段时间内存消耗殆尽,后台程序内存泄露,查找这个原因不知如何下手,请问大牛们有没类似的排查经验?有没有对 valgrind 工具熟悉的?@ 左耳朵耗子@IT程序猿 @ 庄表伟 @ 赵乐天 @ 池建强

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 7 条回复 时间 点赞

内存泄漏的问题,在百度是遇到最多的,阿里相对少点。与内存泄漏斗争了很久,我总结下常用的一些有效测试方法吧。

1、valgrind,这是非常好用的工具,虽然参数很多,输出结果较多,但是只要认真看下,就很容易发现问题,报告是很详细的,不要被吓倒。valgrind 检测的内存泄漏是非常准的,可以精确定位到代码行甚至是变量。valgrind 基于 valginrd core 框架,这是个非常有强大的框架,他的作用不仅仅在于检测内存泄漏的,强烈建议测试新手通读下全部的文档。valgind 自己也会有误报和漏报,所有具体场景需要具体分析。报告中一旦出现 definitely lost 的标记,就表示一定会有内存泄漏,泄漏的字节数也会报告出来,可以根据泄漏的内存大小和请求次数计算出到底是那个变量没有释放。

2、利用 pmap+gdb,pmap 可以列出特定进程的所有内存分配的地址和大小,通过 gdb 就可以直接看这些地址属于什么变量,通过统计这些内存地址的大小,就可以很容易的发现问题。利用自动化的 gdb 调试工具也可以很方便的定位。

3、其他的还包括 memprof、商业工具 Purify IBM 出品,官方宣传说的不错,但是这种不开放的技术,在业界得不到认可,国内大公司一般那都不用,只有人傻钱多的公司在用。

4、利用一些 trace 工具,比如 ptrace,strace 之类的工具,这些 trace 工具会追踪特定的 api,只需要统计 malloc 和 free 的调用次数就可以简单的发现是否有泄漏,但是无法定位代码行。另外还有一个更高深的工具,SystemTap,这个在国内应用还不多,但是非常厉害,可以方便 hook 程序的关键逻辑并插入探针。从而可以方便的检测内存泄漏。Systemtap 目前还不通用,而且安装复杂,暂时不推荐使用,可以关注下,过几年可能会大规模应用。

valgrind 是首选,因为他的设计就是为了解决所有的 c++ 的内存问题。一些 valgrind 不能简单发现的,我一般会 review 代码,然后通过 gdb 自动调试技术来发现问题。通过 valgrind+gdb,可以解决所有的内存泄漏。

另外,内存的泄漏也并不完全是没有及时的 free,还有可能是其他的原因,比如设计问题等。需要靠一定的开发经验判断。
要尽量把静态测试和动态测试尽早的加入到持续集成中,以尽早的发现问题,不然一旦代码复杂,追查的成本就会增大。

不错,都是 自己写的啊,基本都没用过

学习了,写的这些工具都没摸过,的确是缺少这方面的关注啊。

学习了~谢谢

虽然话题过去了很久,但我很想说说。其实内存泄露检查这一块应该是属于代码静态分析这一块来完成,就像楼上所说 valgrind 应该也算是。个人认为其实代码静态分析其实是成本极低但效果极好的一项测试内容,他没有自动化那么高额的维护成本,但能很快找代码中的纰漏。所以很奇怪,为什么论坛里对于它的讨论极少?

C# 的程序 (WPF 界面程序),有什么好的工具推荐进行内存泄漏的查找吗

Cheny 回复

因为白盒测试的人少吧

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册