我有一个已进入挂起状态的应用程序。这个应用程序实际上是三个不同的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的堆和堆栈中的应用程序数据,我可以检查数据堆积的位置。什么变量/数组正在吞噬价值。任何人都可以告诉我一个方法吗?
答案 0 :(得分:1)
有多种选择,具体取决于您遇到的挂起类型。一个是低CPU挂起,这可能是一个死锁。另一个是高CPU挂起,这可能是一个无限循环。调试死锁通常更容易,因为您可以获得良好且始终相同的callstack。调试高CPU挂起更难,因为可能存在不同的callstack,具体取决于您进行转储的时间。您需要多次转储 - 或者更好地使用分析器。
回答你的问题:
如何分析?
有三个主要选择
!analyze -v
作为您的第一个命令。但无论如何,试试任何人都可以告诉我一个方法吗? [找出数据堆积的位置]
我无法清楚地看到大量数据与挂起的应用程序有什么关系。数据位于堆栈上或堆上,具体取决于您实现应用程序的方式。请注意,在C ++中,对象类型和内存之间没有明确的映射,就像在.NET中一样。您不能简单地键入像显示类型为Xyz 的所有对象的命令。
在Visual Studio中,您可以幸运地获得局部变量等,因为它们可能会得到解决。在WinDbg中,您可以使用一些!heap
命令,并可能配置一些GFlag设置以跟踪内存分配。