转储分析问题

时间:2010-12-27 11:00:52

标签: c++ windbg

我试图抓住地址的堆栈跟踪,但它总是没有显示任何内容,

我的问题是分析内存泄漏,所以我查询了所有堆静态,然后查询最高分配内存,它返回了我很多分配,

我尝试通过“!heap -p -a ####”搜索许多分配地址,####是地址。 但它永远不会给我任何调用堆栈,

但如果我在内存中搜索此地址/任何其他地址,则会显示类似的分配。

如果我尝试运行此命令“dt ntdll!_DPH_HEAP_BLOCK StackTrace ####,”,它会返回NULL堆栈跟踪。

是不是因为应用程序的页面堆没有启用????

2 个答案:

答案 0 :(得分:0)

对于本机内存问题,您无法轻松使用转储来确定根本原因。

Microsoft为32位进程提供了一个工具DebugDiag,

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3&displaylang=en

在某些典型情况下,您可以使用它来跟踪本机内存泄漏,

http://support.microsoft.com/kb/919790

此外,涉及Microsoft支持团队可以加快根本原因分析,

http://support.microsoft.com

答案 1 :(得分:0)

这里有很多东西,首先你不会得到你无法访问的符号的完整堆栈跟踪,为此你需要没有删除私有符号的pdbs。

对于在WinDbg中输入'.symfix; .reload'的微软符号应解决该问题。

其次,虽然您不会为自己的应用程序dll获得第三方dll的堆栈跟踪,但您需要确保带有公共符号的pdbs与用于生成转储的版本匹配。

您可以要求客户在gflags中生成用户堆栈跟踪并重现错误或向您发送带有完整符号信息的pdbs。

也可以在Visual Studio中打开转储文件:

  1. 文件 - >打开 - >项目/解决方案导航到转储文件,然后点击“确定”
  2. 在解决方案资源管理器中右键单击项目 - >调试 - >启动新实例
  3. 您可能会发现这种方法比较熟悉,但您无法访问WinDbg工具,但由于这是一个事后分析,您可以在Visual Studio和WinDbg中打开转储,因为您无论如何都没有进行有创调试。