3

我向 Windows 10 Store 提交了我的nativeWin32 应用程序,该应用程序使用转换器转换为 UWPProject Centennial应用程序。该应用程序通过了商店认证,可通过私人链接获得(在我测试时)。

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

我登录到Windows Dev 帐户,然后转到我的Dashboard,果然该应用程序显示了一次崩溃:

在此处输入图像描述

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

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

在此处输入图像描述

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

在此处输入图像描述

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

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

在此处输入图像描述

然后,如果我单击下载,我会得到一个很小的文本文件stackTrace.tsv(117 字节),其中包含以下内容:

在此处输入图像描述

有没有办法检索一个功能性的迷你转储.dmp文件,我可以在 Visual Studio C++ 项目中使用它来使用native调试器分析这个崩溃?

4

2 回答 2

4

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

在此处输入图像描述

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

在此处输入图像描述

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

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


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

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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

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

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

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

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

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

在此处输入图像描述

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

0xD0000+0x1D500

在此处输入图像描述

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

在此处输入图像描述

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

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

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

于 2017-02-01T21:23:15.500 回答
-2

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

  1. 在 Visual Studio 中调试进程时,可以在调试器在异常或断点处停止时保存转储文件。选择将转储另存为,调试。在Save Dump As对话框中,在Save as type 列表中,您可以选择MinidumpMinidump with Heap(默认)。
  2. 启用即时调试后,您可以将调试器附加到在调试器外部运行的崩溃进程,然后保存转储文件。请参阅附加到正在运行的进程
  3. 创建转储文件的其他方法。更多详细信息,您可以参考使用转储文件

希望这可能对您有所帮助。

于 2017-01-09T09:25:48.080 回答