如何使用Visual C++应用程序的完整应用程序数据读取Minidump的应用程序数据
How to read the application data of a Minidump with full Application data for a Visual C++ application?
我有一个应用程序已进入挂起状态。这个应用程序实际上是三个不同ex的组合。UI.exe、core.exe、core.dll,这些基本都是在VC++上构建的。所以当我查看应用程序日志时,我可以看到ui.exe在某个地方停止了。因此,我通过任务管理器->进程->选择ui.exe和core.exe右键单击它并"创建转储文件",获得了包含完整应用程序数据的迷你转储。ui.exe dmp文件中存在一些150MB以上的数据。如何分析?
到目前为止,我可以加载转储文件及其所有必要的pdb文件(应用程序+系统),并成功地加载了值。我可以看到应用程序正在运行,但没有响应core.exe请求。
现在我真的在寻找ui.exe和core.exe的堆和堆栈中的应用程序数据,这样我就可以检查数据的堆积位置。哪个变量/数组正在吞噬该值。有人能告诉我怎么做吗?
根据您经历的挂起类型,有几个选项。一个是低CPU挂起,这可能是死锁。另一个是高CPU挂起,这可能是一个无休止的循环。调试死锁通常更容易,因为您可以获得良好且始终相同的调用堆栈。调试高CPU挂起比较困难,因为根据转储的时间,可能会有不同的调用堆栈。您需要几个转储,或者最好使用探查器。
回答您的问题:
如何分析
主要有三种选择
- Visual Studio。这似乎是你所做的,但由于某种原因,你无法从你所看到的事情中得出结论。发生这种情况的原因可能是Visual Studio没有提供必要的分析步骤,或者它们隐藏在某个地方,所以您找不到它们
- WinDbg当然是所有想要更多命令和控制的人的选择。现在下载它,开始在简单的情况下使用它,熟悉它,最后你会讨厌它,但它仍然是你最喜欢的调试器。既然学习起来难得离谱,那么在这种情况下你就不会取得好的进步。如果要执行,请使用
!analyze -v
作为第一个命令。但无论如何,试着 - 调试诊断。做一个挂起的分析,希望它能给你一些有用的信息
有人能告诉我怎么做吗?[找出数据堆积的位置]
我无法清楚地看到大量数据是如何与挂起的应用程序相关的。数据在堆栈上或堆上,具体取决于应用程序的实现方式。请注意,在C++中,对象类型和内存之间没有像.NET中那样清晰的映射。您不能简单地键入命令,如显示Xyz类型的所有对象。
在VisualStudio中,局部变量等可能是幸运的,因为它们可能会被解析。在WinDbg中,您可以使用一些!heap
命令,并可能配置一些GFlag设置来跟踪内存分配。
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 更改应用程序数据的路径
- 使用 pipe() 和 fdopen() 将数据从 Python 脚本传递到 Windows 中的C++应用程序
- 将数据从一个应用程序单向发送到另一个应用程序的最佳做法
- 从 Windows 中的其他应用程序 GUI 中提取数据
- 无法使用管道将数据发送到我通过exec(C++)启动的第二个应用程序
- 在网格视图中显示数据 - 基于 MFC c++ 对话框的应用程序
- 安卓中的Qt和应用程序数据存储
- 从Qt应用程序读取元数据
- 是否有一种简单的方法可以从普通的 win32 C++代码向应用程序见解提供数据?
- 如何使用Qt读取我的应用程序屏幕像素数据
- 在 API 和应用程序线程之间共享数据
- 关系应用程序数据的并发更新
- Qt指定某些应用程序数据的位置
- C++编程:导航到用户文件以保存每个用户的应用程序数据
- 如何使用Visual C++应用程序的完整应用程序数据读取Minidump的应用程序数据
- 如何使用C++在RAD Studio XE6中存储Android应用程序数据/设置