C ++中的运行时内存分析

时间:2011-10-19 04:14:49

标签: c++ linux memory-management profiling

我知道在使用massif和其他工具进行内存分析时已经有了一些线程,但我想知道在生产环境中是否有任何工具或常用技术可用于运行时内存分析。

可以想象一个实现,其中每个类都提供一个memSize()函数,并通过在所有成员上调用memSize()并添加自己的大小(或大小估计)来扩展容器。然后,在任何时候,您都可以使用大部分内存查询应用程序并查看哪些主要数据结构正在使用,以及它随时间的变化情况。

不幸的是,上述策略可能很棘手 - 您必须处理诸如锁定,内存对齐等问题,有时您不会知道第三方数据结构有多大而且您必须猜测。总的来说,将它添加到所有类中似乎还有很多工作......

所以要提出实际问题 - 在生产过程中监控内存使用情况和运行时内存增长的原因是什么?

1 个答案:

答案 0 :(得分:2)

如果您愿意:

  • 实施自己的内存管理;或
  • 围绕正在使用的内存alloc / dealloc函数创建包装器

然后您可以跟踪分配的内容,大小和所有者。在我们的嵌入式设备中,我们扩展了内存管理器,以记录分配的每个内存块的附加信息。在我们的案例中,我们会跟踪以下内容:

  • 时间戳
  • 线程ID
  • 块大小
  • 分配时的堆栈跟踪

我们有一种机制可以让系统遍历阻止列表(链接列表)并将上面的每个块的信息转储到.csv文件。这可以在系统内存不足或检测到内存损坏时自动触发,也可以随时手动触发。一旦生成了.csv文件,我们就会有一个Perl脚本来消化它,并根据原始线程,堆栈跟踪等对请求进行分组。这非常方便,例如,它允许我们查看有多少内存和多少分配来自代码中的给定位置。

我们发现在查找泄漏时非常有用的技术是在某些进程运行时在不同时间生成两个或更多.csv报告。比较消化的内存日志可以让我们轻松发现泄漏的内存。

我们发现添加此信息的开销是在噪音中,因此我们在生产系统中启用了此功能,因此当单元在现场失败时,我们可以收集.csv文件并执行验尸分析