如何找到不是内存泄漏的内存泄漏?

How to find a memory leak that isn;t a memory leak?

我有一个大程序,我注意到内存在稳定增长,直到我的机器无法处理它,我不得不重新启动它。

通常这会是内存泄漏,但是我使用了 libasan 和 valgrind 都没有发现泄漏。

我怀疑正在发生的事情是,由于逻辑错误,动态结构在代码内部某处正在不受控制地增长。例如,一个 vector 一次又一次地保留更大的值。就 asan 而言,这不是内存泄漏,因为它会在程序终止时被清除,但会产生完全相同的效果。

可以使用什么工具来尝试识别内存中哪些对象最大?即试图找到实际上不是泄漏的“内存泄漏”。

尝试https://github.com/vmware/chap

它会对您有所帮助,因为它可以计算分配之间的引用图,还可以识别 std 容器使用的许多不同类型的分配。

运行 你的进程,未经检测,直到它比你预期的大得多,然后使用 gcore 收集一个活的核心,在章节中打开核心并从 https://github.com/vmware/chap/blob/master/USERGUIDE.md#analyzing-memory-growth[ 中的建议开始=12=]

有人推荐我使用 heaptrack 和 heaptrack_gui 来解决 linux 上的这个问题,它正是我解决问题所需要的。它根据调用层次结构向您显示内存分配的火焰图,因此您可以逐个调用缩小可能过度分配的范围。

出于好奇,我的应用程序中的潜在问题是一个单一的 vulkan 图像,我忘记释放它的内存。