当前位置: 首页 > 科技观察

一个穷人的内存泄漏检测方法

时间:2023-03-18 13:11:04 科技观察

市面上已经有很多检测程序代码资源泄漏的工具,但是今天要介绍的是一种新的方法,不需要安装任何工具,也不需要特定的编译器开关,而且没有第三种-需要派对图书馆。即:让程序一直运行,直到泄漏的原因被自动揭示出来。这是什么意思?日常自动压力测试通常是工程开发的常规部分。有的软件开发团队使用屏保作为触发器,有的使用自定义程序,还有的需要手动发起压力测试,但不管怎样,你下班回家后,你的电脑连接上测试服务器,收到一套整夜运行的测试。这些压力测试经常出现的一件事是某种内存泄漏,由压力测试团队发现,因为程序的资源使用率异常高。但是如何调试这些故障呢?这些机器没有运行带有泄漏检测工具的特??殊检测版本,因此您无法使用它。相反,你可以使用一种新的检测思路:目标运行平台具有丰富的资源环境(target-richenvironment)。假设您的程序正在泄漏内存。在连续大量使用十五个小时后,程序开始出现内存不足的情况。您显然在泄漏某些东西,但到底泄漏了什么?想一想:如果你放弃一些东西,就会有很多。而且您不泄漏的东西很少。因此,如果您抓取随机进程快照,则很可能是泄漏对象!用数学术语来说,假设您的程序的正常内存使用量为15MB,但由于某种原因您已经用完了1693MB的动态分配内存。由于其中只有15兆字节是正常内存使用,因此其他1678兆字节肯定是泄漏数据。如果从堆中转储随机地址,则找到泄漏对象的可能性大于99%。因此,随机抓取十几个地址并将它们转储。您很可能会一遍又一遍地看到相同的数据模式。那就是程序的漏洞点。如果它是具有虚方法的C++对象,转储vtable将快速识别它是什么类型的对象。如果它是POD(普通旧数据)类型,您通常可以通过查看字符串缓冲区或指向其他数据的指针来识别它是什么。最终结果可能会有所不同,但我发现这是一种非常成功的技术,并将其视为一种精神力量。总结我一直在使用TopomelBox中的插件第三方库来检测内存泄漏。通过今天的文章,我明白了:我们只能什么都不做,等到泄漏的原因如此明显的时候再泄漏。俗话说:无为而无不为。