GDB调试技巧实战--揪出内存泄漏元凶
本系列期望用一个简单的实例来展示一些调试技巧。不时更新,欢迎订阅。
1. 问题
本期问题是:在新公司解决的第一个问题竟然是:有个程序有内存泄漏的问题,大概一个月就得重启下程序。这问题听说好久了,在我入职之前有人看过但没解决了。没有重现步骤,因为没总结出规律;也无法去生产环境观察,连ssh上去执行个ps命令也不行。
我得到的信息就是:
1. 有内存泄漏,大概一个月重启下。
2. 有源代码,C++11标准编译。
2. 思路
有问题先问AI,回答如下:
动态检测工具试了,苦于没有重现步骤最终没触发泄漏;静态工具Cppcheck不好弄没试,Clang-Tidy没查出来。
到底是什么类型的泄漏哪?努力的方向很重要,走错了的话浪费了时间也查不到root cause。
先大体看了下项目源码,大量使用智能指针,几乎没有new/delete,于是想到了:可能是智能指针循环引用导致的内存泄漏。
请看下面的例子: