我正在开发一个大型 C 项目,刚刚介绍了我认为是某种内存泄漏的情况。当我运行代码时,我的 RAM 很快就会被耗尽,然后当我退出程序时又会释放出来。问题是 valgrind 似乎并不认为存在内存泄漏,也没有吐出任何消息。
我正在运行它
./valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./a.out
我的猜测是,我正在构建一些大型动态列表,然后在最后释放,因此 valgrind 不会检测到它。有没有办法让 valgrind 在每次函数动态分配内存时吐出一条消息,这样我就可以看到正在调用哪个函数来构建内存。
或者是否有其他程序可以为我提供哪些函数动态分配了多少内存的详细内存数据?
跟踪每个分配可能不是一个好主意。日志文件很快就会变得巨大。
如果您使用 Massif 或 DHAT,它们将分析堆,您将能够看到哪些代码正在分配大量内存。还可以考虑使用
--xtree-memory=allocs
和 kcachegrind 来获取分配的树形视图。
我也推荐
heaptrack
。 Massif 对于计算分配量有点大材小用(除非您的情况是特殊情况,例如静态链接的 exe 或自定义分配器)。