Microsoft 小型转储文件未提供太多信息

Microsoft minidump file not providing much information

我正在使用 Microsoft Minidump 功能,因此我可以分析已发布程序中的崩溃。

https://msdn.microsoft.com/en-us/library/windows/desktop/ee416349(v=vs.85).aspx

代码类似于这个 Whosebug 问题的答案:

How to write a sample code that will crash and produce dump file?

通常当我遇到崩溃时,我可以在 Visual Studio 中打开故障转储文件,它会把我带到有问题的源代码行,这使得解决这些问题变得非常容易。

但有时并不是那么容易。

我有一个故障转储文件,但我无法在其中找到有问题的源代码行。这是为什么?我可以从这个转储文件中获得什么有用的信息?大海捞针有什么诀窍吗?

这是我正在做的。

我通过标签查看此版本的源代码。

我将相应的 pdb 文件复制到与故障转储相同的文件夹中 - 文件是 myprogram.exe.3140.dmp

然后我使用用于构建 exe 的编译器打开故障转储,Visual Studio 2012。

然后我看到了一些有用的信息:

最后写入时间 10/10/2017 15:28:52 进程架构:x86 异常代码 0xC0000005 异常信息 tread 试图读取或写入它没有适当访问权限的虚拟地址。 存在堆信息

OS 版本 6.1.7601

模块: myprogram.exe 1.7.41.0 myprogram.dll 1.1.0.27 等等

然后我点击 Debug with Native Only

然后我得到对话框:

myprogram.exe.3140.dmp 中 0x548BFFD5 的未处理异常:0xC0000005:执行位置 0x548BFFD5 的访问冲突。

在加载的模块中找不到当前堆栈帧。无法显示此位置的来源。

我点击中断按钮

然后说Frame not in module。在加载的模块中找不到当前堆栈帧。无法显示此位置的来源。

然后我单击查看反汇编超链接并查看:

548BFFD5 ?? ??

问号是什么? ?? ??.这是否表明悬空指针问题?还有别的吗?

问号表示地址 0x548BFFD5 处的数据(您的应用程序正试图执行)没有反汇编成任何有意义的数据。

正如您所注意到的,您可能有一个悬空指针,或者正试图执行一个由不再存在的对象指向的函数。或者你正试图执行一个不指向任何东西的函数指针。

如果您使用符号进行编译,您也许可以返回调用 stack/stack-trace 并查看问题的起始位置。