我正在使用Microsoft特性,这样我就可以在发布的程序中分析崩溃。
https://msdn.microsoft.com/en-us/library/windows/desktop/ee416349(v=vs.85).aspx
代码类似于这个堆栈溢出问题的答案:
How to write a sample code that will crash and produce dump file?
通常,当我崩溃时,我可以在Visual中打开崩溃转储文件,它将带我进入源代码中的违规行,这使得解决这些问题变得非常容易。
但有时并不是那么容易。
我有一个崩溃转储文件,在那里我无法找到违规的源行。为什么会这样呢?从这个转储文件中我能得到什么有用的信息?在干草堆里找到针头有什么建议吗?
这就是我在做的事情。
我通过标记签出了这个版本的源代码。
我将相应的pdb文件复制到与崩溃转储文件myprogram.exe.3140.dmp相同的文件夹中。
然后,我使用用于生成exe的编译器Visual 2012打开崩溃转储。
然后我看到一些有用的信息:
最后写入时间为10/10/2017 15:28:52 : x86异常代码0xC0000005异常信息处理程序试图从它没有适当访问权限的虚拟地址中读取或写入异常信息。堆信息
操作系统6.1.7601版
模块: myprogram.exe 1.7.41.0 myprogram.dll 1.1.0.27等
然后单击“只使用本机调试”。
然后我得到了对话框:
在myprogram.exe.3140.dmp: 0xC0000005:访问冲突执行位置0x548BFFD5中,0x548BFFD5处的未处理异常。
在加载模块中找不到当前堆栈帧。无法显示此位置的源。
我单击“中断”按钮。
然后它说帧不是在模块中。在加载模块中找不到当前堆栈帧。无法显示此位置的源。
然后单击视图反汇编超链接并查看:
548 BFFD5 ??
问号是什么?这是否表明存在悬空指针问题?还有别的吗?
发布于 2017-10-11 11:32:52
问号意味着地址0x548BFFD5 (您的应用程序正在尝试执行的)上的数据没有分解为任何有意义的内容。
正如您注意到的,您可能有一个悬空指针,或者正在尝试执行已不存在的对象所指向的函数。或者您正在尝试执行一个没有指向任何内容的函数指针。
如果使用符号进行编译,则可以返回调用堆栈/堆栈跟踪,并查看问题从何处开始。
https://stackoverflow.com/questions/46687036
复制相似问题