如何使用Visual C ++应用程序的完整应用程序数据读取Minidump的应用程序数据?

时间:2014-10-23 11:41:58

标签: c++ windows visual-c++ dump crash-dumps

我有一个已进入挂起状态的应用程序。这个应用程序实际上是三个不同的exes的组合。 UI.exe,core.exe,core.dll。所有这些基本上都是基于VC ++构建的。因此,当我查看应用程序日志时,我可以看到ui.exe在某处停止。所以我通过任务管理器 - >进程 - >选择了ui.exe和core.exe右键单击它和"创建转储文件"。我在ui.exe dmp文件中有大约150MB +的数据。怎么分析呢?

到目前为止,我能够使用所有必需的pdb文件(应用程序+系统)加载转储文件并成功加载值。我能够看到应用程序正在运行但没有响应core.exe请求。

现在我真的在寻找ui.exe和core.exe的堆和堆栈中的应用程序数据,我可以检查数据堆积的位置。什么变量/数组正在吞噬价值。任何人都可以告诉我一个方法吗?

1 个答案:

答案 0 :(得分:1)

有多种选择,具体取决于您遇到的挂起类型。一个是低CPU挂起,这可能是一个死锁。另一个是高CPU挂起,这可能是一个无限循环。调试死锁通常更容易,因为您可以获得良好且始终相同的callstack。调试高CPU挂起更难,因为可能存在不同的callstack,具体取决于您进行转储的时间。您需要多次转储 - 或者更好地使用分析器。

回答你的问题:

如何分析?

有三个主要选择

  • Visual Studio。这似乎是你所做的,但由于某种原因,你无法从你看到的东西中得出结论。这可能是因为Visual Studio不提供必要的分析步骤,或者它们隐藏在某处,因此您找不到它们。
  • WinDbg当然是所有想要更多命令和更多控制权的人的选择。现在下载它,开始使用它来处理简单的情况,熟悉它,最后你会讨厌它,但它仍然是你最喜欢的调试器。由于学习起来非常困难,因此在这个案例中取得了很好的进展。如果您这样做,请使用!analyze -v作为您的第一个命令。但无论如何,试试
  • DebugDiag。做一个挂起分析,希望它会给你一些有用的信息。

任何人都可以告诉我一个方法吗? [找出数据堆积的位置]

我无法清楚地看到大量数据与挂起的应用程序有什么关系。数据位于堆栈上或堆上,具体取决于您实现应用程序的方式。请注意,在C ++中,对象类型和内存之间没有明确的映射,就像在.NET中一样。您不能简单地键入像显示类型为Xyz 的所有对象的命令。

在Visual Studio中,您可以幸运地获得局部变量等,因为它们可能会得到解决。在WinDbg中,您可以使用一些!heap命令,并可能配置一些GFlag设置以跟踪内存分配。