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 并查看问题的起始位置。
我正在使用 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 并查看问题的起始位置。