代码之家  ›  专栏  ›  技术社区  ›  user128300

如何确定哪些C/C++对象使用最多内存

  •  3
  • user128300  · 技术社区  · 16 年前

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

    你知道有什么工具能显示哪些C/C++对象使用最多内存吗? 我已经尝试过调试工具1.1和软件验证的内存验证器,但是两个工具都没有提供足够的信息来识别C/C++对象。

    当做

    弗兰克

    2 回复  |  直到 16 年前
        1
  •  2
  •   Reed Copsey    16 年前

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

        2
  •  2
  •   Moshe Levi    16 年前

    我能建议一个更“核心”的方法吗?

    温伯格!heap命令可以显示关于本机堆的许多重要信息。 首先执行以下步骤:

    a.启动gflags,转到“图像文件”选项卡,键入进程名称,然后按Tab键。

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

    开始你的过程。

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

    重要提示:收集这些信息将使您的应用程序使用更多的内存,而且可能会更慢。每次运行进程时,Windows将继续收集此信息,直到您启动gflags并删除您的选择,否则会告诉您。

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

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

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

    b.选择一堆进行检查。如果您正在寻找大对象,那么提交字节数最高的那个将是一个很好的候选对象。

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

    选择一个更高的分配大小并使用!heap-flt s“size”转储相同大小的所有堆条目。

    哎呀!heap-p-a“userptr”将打印分配堆栈(以及其他信息)。如果不使用gflags设置“启用页堆”,则此信息将不可用。

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

    B.T.W

    如果尚未安装Windows调试工具包,可以从 here .

    也许这种方法并不像你所期望的那么简单,但它是有效的:) 玩得高兴。