【问题标题】:How to determine which C/C++ objects use most memory如何确定哪些 C/C++ 对象使用最多的内存
【发布时间】:2010-12-10 15:30:33
【问题描述】:

我有一个混合模式应用程序(托管和本机),它占用大量内存。我已经发现大部分内存是由本机代码分配的。我不是在说内存泄漏,而是在程序启动后很早就出现的高内存消耗,然后相对稳定。

您是否知道有任何工具可以显示哪些 C/C++ 对象使用最多的内存? 我已经尝试过 DebugDiag 1.1 和 SoftwareVerify 的内存验证器,但是这两个工具都没有提供足够的信息来识别 C/C++ 对象。

问候

弗兰克

【问题讨论】:

    标签: visual-studio-2008 debugging mixed-mode visual-c++-2008


    【解决方案1】:

    我可以建议一个更“硬核”的方法吗?

    WinDbg 的 !heap 命令可以揭示很多关于本机堆的重要信息。 首先执行以下步骤:

    A.启动 GFlags,转到 Image File 选项卡,输入您的进程名称并按 Tab。

    B.按“启用页堆”和“创建用户模式堆栈跟踪数据库”,然后按确定。

    C.开始你的过程。

    执行上述步骤将告诉 Windows 收集有关您的进程的内存分配信息。我们稍后将使用这些信息。

    重要提示:收集此信息将使您的应用程序使用更多内存并且可能会变慢。每次您运行进程时,windows 都会继续收集此信息,直到您;否则会通过启动 GFlags 并删除您的选择来告诉它。

    将 WinDbg 附加到您的应用程序并设置正确的符号。除了您自己的符号,您还需要 Microsoft 的符号。使用 .symfix 命令,然后使用 .reload /f 让 WinDbg 从微软的符号服务器下载正确的符号(可能需要几分钟)。

    设置好所有符号后,执行以下步骤:

    A. !heap -stat - 查看所有进程堆的使用摘要

    B.选择一个堆来检查。如果您正在寻找大对象,那么提交字节数最高的将是一个不错的候选者。

    C. !heap -stat -h "heap handle" - 查看堆的分配统计信息。在输出中,您会发现为每个分配大小分配了多少块。

    D.选择较大的分配大小之一并使用 !heap -flt s "size" 转储相同大小的所有堆条目。

    E. !heap -p -a "UserPtr" 将打印分配堆栈(以及其他信息)。如果您不使用 GFlags 设置“启用页堆”,则此信息将不可用。

    就是这样,使用调用堆栈中的信息并查看源代码来识别那些大对象。

    B.T.W

    如果您还没有安装 Debugging Tools for Windows 软件包,您可以从 here 下载它。

    也许这种方法并不像您预期​​的那么简单,但它确实有效 :) 玩得开心。

    【讨论】:

    • WinDbg 似乎没有说出进程内存的全部真相:根据 Windows 任务管理器,我的进程有 121 MB 的已提交内存。 “!heap -s”表示已提交的内存为 33 MB,“!heap -stat”表示已提交的内存为 2.3 MB。
    【解决方案2】:

    AQTime's memory profiler 很适合这个。它是我尝试过使用同一分析器处理本机代码和托管代码的少数分析器之一,包括支持混合模式程序集。

    【讨论】:

    • 我试过AQtime,但是混合模式应用似乎有问题。我已经尝试了几个不同的程序(包括简单的“Hello, world”类型的程序),但是当 AQtime 访问它们时,它们会崩溃。我已经联系了制造商的支持
    • 人力资源部。对我来说很好,在这里。我只尝试过以 x86 为目标的混合模式应用程序 - 也许就是这样?
    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多