【问题标题】:How to get a crash dump (or any usable crash report) for a converted Windows Store UWP app?如何获取转换后的 Windows Store UWP 应用程序的故障转储(或任何可用的故障报告)?
【发布时间】:2017-05-22 12:10:51
【问题描述】:

我使用Project Centennial 转换器将我的native Win32 应用程序提交到Windows 10 商店,该应用程序是converted to UWP 应用程序。该应用通过了商店认证,可通过私人链接访问(我正在测试它)。

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

我登录了Windows Dev account,然后转到我的Dashboard,果然应用显示了一次崩溃:

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

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

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

好的。堆栈跟踪不是我所期望的,但我会看看。

所以如果我点击stack trace,我会弹出这个:

然后,如果我点击下载,我会得到一个很小的文本文件 stackTrace.tsv(117 字节),里面确实有这个:

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

【问题讨论】:

  • 嘿@StefanWickMSFT 是否有更新的方法可以从 Windows 应用商店检索故障转储?我在下面描述的方法不再有效。
  • 商店默认不提供崩溃转储文件(这与桌面桥无关,对于 UWP 崩溃也是如此)。 .dmp 文件传递​​是按帐户启用的。我建议你在商店开一张票。
  • @StefanWickMSFT:哦,谢谢,伙计!我不知道。他们为什么不记录下来。无论如何,只是一个修辞点。我刚刚在this page 提交了一封电子邮件“事件”,请求为我的帐户启用 .dmp 文件收集。找到它有点棘手。我猜这就是你的意思,对吧?
  • @StefanWickMSFT:老兄,here's the run-around 我是通过我的开发帐户提交给 Windows 应用商店的票证。没有什么不寻常的。 (这就是我现在远离任何外包支持热线的原因。)那么现在呢?
  • 我跟进了拥有这个的团队,结果发现我的信息已经过时了。一段时间以来,所有开发人员帐户的转储文件交付已经开启,但我们只允许共享在 Windows Insider 版本中收集的转储文件,而不是从生产版本中收集的转储文件。因此,您需要在 Insider 构建中至少获得一次崩溃实例,才能在您的开发中心帐户中看到 .dmp。

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


【解决方案1】:

编辑: 我想指出以下内容似乎不再适用于更新的 Windows 应用商店。现在,如果一个人去 App -> Analytics -> Health 崩溃可能看起来像这样:

然后微软提供了这个小花絮:

这些都没有给我任何有用的信息来定位崩溃,就像以前一样(见下文。)我显然不想用 .pdb 文件或符号来发布我的应用程序,比如它建议在上面。

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


您知道,我应该感谢 Microsoft 实际从 UWP 应用程序崩溃中实现堆栈跟踪收集。我在我的 Windows 应用商店 Win32/UWP 应用程序中得到了实际的崩溃,这就是我如何利用它来找到一个潜在的错误。

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

如果是这样,请单击该数字/链接并一直向下滚动到详细说明 Failures 的位置。就我而言,这是一个看起来像这样的崩溃:

点击它,会弹出另一个窗口。向下滚动到Failure Log

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

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

以下是查找崩溃实际位置的方法:

使用崩溃文件的精确副本恢复您的 Visual Studio 解决方案。 (我假设您在将解决方案的 release 构建以及 .exe.pdb 文件上传到 Windows 应用商店之前将其存档。)

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

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

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

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

0xD0000+0x1D500

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

那么这一切都取决于您的调试技巧。就我而言,这很容易看出——nRow 索引超出了范围。所以修复这个错误非常简单。

再次,我要感谢 Microsoft 提供这样的功能。我不知道上面显示的错误,如果我试图在简单的最终用户报告之后发现应用程序崩溃的原因,我会感到很困难。

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

【讨论】:

  • 这是一个很棒的方法。我有基地址 00B50000 - 它如何转换为十六进制格式?
【解决方案2】:

你可以试试这个方法来创建转储文件。

  1. 在 Visual Studio 中调试进程时,可以在调试器在异常或断点处停止时保存转储文件。选择转储另存为,调试。在Save Dump As对话框中,在Save as type list中,可以选择MinidumpMinidump with Heap(默认)。
  2. 使用Just-In-Time Debugging enabled,您可以将调试器附加到在调试器外部运行的崩溃进程,然后保存转储文件。见Attach to Running Processes
  3. create dump file 的其他方法。 更多详细信息,您可以参考using Dump files

希望这对你有帮助。

【讨论】:

  • @CheeryBu:好吧,如果我在那台机器上运行调试器,我就不需要保存转储文件。我问的是我的应用程序在最终用户的机器上崩溃的情况。 Windows 应用商店是否会从 UWP 应用收集故障转储,在这种情况下我可以检索这些信息?
  • @c00000fd,我认为您可能无法直接从 Windows 开发中心仪表板获取转储文件,如果需要,请向 Microsoft 报告您的 feedback。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2011-08-27
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多