我有一个具有高内存占用量的混合模式应用程序(托管和本机)。我已经发现大部分内存都是由本机代码分配的。我不是在谈论内存泄漏,而是关于在程序启动后很早就发生的高内存消耗,然后相对稳定。
您是否了解任何可以向您显示哪些C / C ++对象使用最多内存的工具? 我已经尝试过DebugDiag 1.1和SoftwareVerify的Memory Validator,但这两个工具都没有提供足够的信息来识别C / C ++对象。
此致
谢
答案 0 :(得分:2)
AQTime's memory profiler适用于此。它是我尝试使用相同探查器处理本机代码和托管代码的少数分析器之一,包括支持混合模式程序集。
答案 1 :(得分:2)
我可以建议更“硬核”的做法吗?
WinDbg的!heap命令可以显示有关本机堆的许多重要信息。 首先执行以下步骤:
一个。启动GFlags,转到“图像文件”选项卡,键入进程名称并按Tab键。
B中。按“启用页面堆”和“创建用户模式堆栈跟踪数据库”,然后按确定。
℃。开始你的过程。
执行上述步骤将告诉Windows收集有关您的进程的内存分配信息。我们稍后会使用这些信息。
重要提示:收集此信息将使您的应用程序使用更多内存,并且可能会更慢。每次你运行你的过程时,windows都会继续收集这些信息,直到你通过启动GFlags并删除你的选择来告诉它。
将WinDbg附加到您的应用程序并设置正确的符号。在你自己的符号旁边,你需要微软的符号。使用.symfix命令,然后使用.reload / f使WinDbg从microsoft的符号服务器下载正确的符号(可能需要几分钟)。
设置完所有符号后,执行以下步骤:
一个。 !heap -stat - 查看所有进程堆的用法总结
B中。选择一个要检查的堆。如果你正在寻找大对象,那么具有最高提交字节的那个将是一个很好的候选者。
℃。 !heap -stat -h“堆句柄” - 查看堆的分配统计信息。在输出中,您将找到为每个分配大小分配的块数。
d。选择一个较高的分配大小并使用!heap -flt s“size”来转储相同大小的所有堆条目。
电子。 !heap -p -a“UserPtr”将打印分配堆栈(以及其他信息)。如果您不使用GFlags设置“启用页面堆”,则此信息将不可用。
就是这样,使用来自调用堆栈的信息并查看源代码来识别那些大对象。
B.T.W
如果您尚未安装Windows调试工具包,则可以从here下载。
也许这种方法并不像你预期的那么简单,但它有效:) 玩得开心。