如何为转换的Windows应用商店UWP应用获取崩溃转储(或任何可用的崩溃报告)?

时间:2017-01-07 23:06:58

标签: uwp windows-store-apps windows-store project-centennial desktop-bridge

我使用native转换器向Windows 10存储了我的Project Centennial Win32应用converted to UWP app。该应用程序通过了商店认证,可以通过私人链接获得(我正在测试它。)

在运行测试时,应用程序挂断并崩溃一次。所以我试图检索任何可用的崩溃转储来诊断问题。

我已登录Windows Dev account,然后转到我的Dashboard,确定应用程序显示一次崩溃:

enter image description here

然后我点击了它。新的Health页面显示了崩溃发生的时间,市场等等。(无法帮我调试问题的东西。)

然后在底部我看到了这个:

enter image description here

我点击了MOAPPLICATION_HANG_所在的蓝色链接,然后打开了Failure details窗口。然后,如果我一直向下滚动(命中图的过去日期和时间),我会看到:

enter image description here

行。堆栈跟踪并不完全符合我的预期,但我会看看。

因此,如果我点击stack trace,我会弹出这个:

enter image description here

然后,如果我点击下载,我会得到一个小文本文件stackTrace.tsv(117个字节),其中包含了这个文字:

enter image description here

有没有办法检索我可以在Visual Studio C ++项目中使用的函数mini-dump .dmp file来使用native调试器分析此崩溃?

2 个答案:

答案 0 :(得分:3)

编辑: 我想指出以下内容似乎不再适用于更新的Windows应用商店。现在,如果有人去App - >分析 - >崩溃的健康状况可能如此:

enter image description here

然后Microsoft提供了这个小小的消息:

enter image description here

这些都没有给我任何有用的信息来找到崩溃,就像之前一样(见下文)。我显然不想发送带有.pdb文件或符号的应用程序,就像上面建议的那样。

因此,如果有人找到可行的解决方案,我有兴趣知道它......

你知道,我应该赞扬微软从UWP应用程序崩溃中实际实现堆栈跟踪集合。我得到了我的Windows Store Win32 / UWP应用程序中的实际崩溃,以及我如何利用它来查找潜在错误。

首先,当您登录dashboard时,请检查应用列表,看看是否有任何崩溃:

enter image description here

如果是这样,请点击该号码/链接,然后一直向下滚动到详细信息Failures。在我的情况下,这是一个看起来像这样的崩溃:

enter image description here

点击它,这将打开另一个窗口。向下滚动到Failure Log

enter image description here

它将显示崩溃发生的时间,应用程序的版本,它发生的设备(非常好!)然后有一个堆栈跟踪链接。所以点击它:

enter image description here

这就是崩溃时我的实际堆栈跟踪的样子。由于该人的计算机没有带有我的可执行文件的符号(.pdb文件),我的应用程序中的所有方法都显示为空白偏移量。

以下是如何找到崩溃的实际位置:

使用已崩溃文件的精确副本还原Visual Studio解决方案。 (我假设您已将解决方案的release版本与.exe.pdb文件一起归档,然后再将其上传到Windows应用商店。)

启动Visual Studio,打开已崩溃应用的版本,切换到Release 配置和disable builds。 (这部分很重要,因为否则Visual Studio会在你开始调试之前尝试构建你的项目,这可能会搞乱你从堆栈跟踪中获得的函数偏移!)

然后在第一个构造函数中的某个位置放置一个断点,该构造函数将立即加载您的应用程序。您需要确保在崩溃之前触发它。

开始调试(点击F5)并等待断点命中。然后显示Modules窗格(Ctrl + Alt + U)并找到您的可执行文件并获取其基地址:

enter image description here

就我而言,它是0xD0000。然后切换到反汇编(Alt + 8)并在反汇编窗口顶部的Address栏中输入上面堆栈跟踪的基址+崩溃偏移量。我的情况是:

0xD0000+0x1D500

enter image description here

并点击Enter以显示代码中的位置。这将显示崩溃发生的位置。就我而言,就是这一行:

enter image description here

然后一切都取决于你的调试技巧。在我的例子中,很容易看出 - nRow索引超出范围。因此修复此错误非常简单。

同样,我想对微软提供这样的功能表示感谢。我不知道上面显示的错误,如果我试图发现在一个简单的最终用户报告之后崩溃应用程序,我会很难受。

PS。最后,我认为我的第一个示例中没有收集堆栈跟踪的原因是因为应用程序已挂起。因此,在这种情况下,可能不会收集调试信息。 (只是猜测一下。)

答案 1 :(得分:-3)

您可以尝试使用此方法创建转储文件。

  1. 在Visual Studio中调试进程时,可以在调试器在异常或断点处停止时保存转储文件。选择保存转储,调试。在保存转储为对话框的保存类型列表中,您可以选择 Minidump 带有堆的小型转储(默认)。
  2. 使用Just-In-Time Debugging enabled,您可以将调试器附加到在调试器外部运行的崩溃进程,然后保存转储文件。见Attach to Running Processes
  3. create dump file的其他方法。 更多详细信息,您可以参考using Dump files
  4. 希望这可能对您有所帮助。