崩溃转储分析: CxxUnhandledExceptionFilter

3

我有一个崩溃的小转储文件需要分析。我的程序是多线程Qt5应用程序。我不是调试大师,但通常我可以很容易地找到程序失败的位置,但这次我找不到。我在Visual Studio 2010中打开了转储文件,点击“仅使用本机调试”,它向我展示了问题所在的位置:它是位于“__CxxUnhandledExceptionFilter”的线程。调用堆栈如下:

msvcr100.dll()!_abort()
msvcr100.dll()!terminate()
program.exe!__CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS * pPtrs)
KERNELBASE.dll!_UnhandledExceptionFilter()
ntdll.dll!__RtlUserThreadStart()
ntdll.dll!__RtlUserThreadStart()

我希望在堆栈中看到程序函数和Qt内部函数。但是这个调用堆栈并没有提供有趣的信息。请告诉我"ExceptionFilter"线程是什么,并且我如何找到程序实际失败的地方?

1个回答

3

您正在查看应用程序,在此处默认异常过滤器已经捕获未处理的异常。

也就是说,您没有看到发生异常的那一行代码。

不幸的是,这意味着 minidump 可能不包含有用的信息。

您可以尝试检查 _EXCEPTION_POINTERS 结构体,它可能包含触发未处理异常的指令的 EIP

请查看 pPtrs->ExceptionRecord->ExceptionAddress 的值,该值应该保存了 EIP

来自 MSDN:

ExceptionAddress:异常发生的地址。

要在异常发生点获取堆栈跟踪,请阅读http://support.microsoft.com/kb/313109


哇,你回答得好快,谢谢 :) 异常地址指向 kernelbase.dll,我可以看到它是 _RaiseException@16 函数。这是内核的错误吗? - YuriM
@YuriM 哈哈,不太可能。你可能给一个WinApi函数提供了一些错误的参数,或者你调用的代码有问题。这些函数会进行合理性检查,如果数据不符合要求,它们会抛出异常。你有没有检查其他的参数?在结构体中可能有调用栈的记录。 - sashoalm
我下周会在稍后完成它 :) - YuriM
我刚刚找到了一篇关于如何获取堆栈跟踪的文章 - http://support.microsoft.com/kb/313109 - sashoalm
kb-313109是解决方案。它工作得非常好,我成功地实现了自己想做的事情。 - YuriM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接