查找使用核心文件消耗的内存

时间:2013-08-19 10:04:54

标签: c++ gdb valgrind totalview

我正在分析我们软件中的高内存消耗问题。我有一个与此高内存消耗相对应的核心文件(此核心文件是通过终止生成核心文件的应用程序生成的)。但我无法使用此核心文件查看实际内存消耗。我使用Totalview和gdb ...使用这两个我没有得到我的进程消耗的总内存的快照以及哪个库占用了所有内存。

这种内存消耗超过10到20天,因此我试图找出造成这种高内存消耗的原因。

valgrind可以帮我分析这个核心文件吗?

非常感谢任何意见/建议。

1 个答案:

答案 0 :(得分:0)

@suresh,

嗨,我是Rogue Wave Software的TotalView产品经理。

你能描述一下这个场景吗?该程序是否长时间与“正常内存消耗”一起运行,然后突然内存消耗通过屋顶?或者程序是否会缓慢而稳定地消耗内存,直到耗尽可用资源?

当它崩溃时它会崩溃,因为它确实耗尽了内存,或者你是因为它已经开始交换而没有响应而杀了它?

一般情况下,我建议在MemoryScape(在TotalView或Standalone版本)下运行它,当它开始显示意外的内存消耗时,你想暂停它并运行内存泄漏报告。这可能会指出问题所在。

内存使用可能不是“经典”泄漏,因为您仍然有引用数据的指针 - 但您只是过度分配。在这种情况下,您不会在泄漏报告中看到任何内容,但您可以通过观察哪些分配正在增长来挑选哪个分配“变坏”。有很多方法可以做到这一点。

  1. 定期暂停,并注意堆状态源代码报告中的堆使用情况如何分解。例如,您可能会注意到与特定源代码文件关联的分配数量不断增加。

  2. 如果您正在使用TotalView,则可以在程序运行良好时使用“设置堆基线”功能,然后针对此基准进行过滤。您可能还想使用源代码报告(尽管图形或回溯报告也支持过滤)。

  3. 或者您可以使用“导出内存数据”功能来存储“正常”堆状态的图像。这将创建二进制堆状态文件。然后让程序运行直到你进入程序具有高内存消耗的状态。此时,您暂停实时应用程序,加载存储的堆数据文件,然后进行比较。

  4. 哇,这已经很久了。最后一个想法。你说你得到核心文件。在调试器下,您应该有机会在清理之前检查正在运行的程序。如果没有发生这种情况,请告诉我。如果你真的想通过核心文件工作(例如,这是在生产环境中发生的,你不想在那里运行调试器)让我们知道 - 有些技术我们可以使用HIA来检测应用程序然后,您可以对堆状态进行脱机分析。

    祝你好运!

    Chris Gotbrath

    TotalView和ThreadSpotter的主要产品经理,Rogue Wave软件

    电子邮件:首先。最后在流氓波。 com