尝试使用gperftools提供的堆分析器.我总是从源代码构建它,但它可以作为几个Linux发行版下的预编译包.
将动态库链接到可执行文件并运行程序就像使用它一样简单.它收集有关每个动态内存分配的信息(据我所见),并在每次发生以下任一情况时将内存转储保存到磁盘:
HEAP_PROFILE_ALLOCATION_INTERVAL 字节已由程序分配(默认值:1Gb)HEAP_PROFILE_INUSE_INTERVAL字节增加(默认值:100Mb)HEAP_PROFILE_TIME_INTERVAL 秒已过(默认值:无效)HeapProfilerDump()从您的代码中调用根据我的经验,最后一个是最有用的,因为您可以准确控制何时获取堆使用情况的快照,然后比较两个不同的快照并查看错误.
最终,有几种可能的输出格式,如文本或图形(以有向图的形式):
使用此工具,我已经能够发现使用Massif无法找到的不正确的内存使用情况.