【问题标题】:Crashdump analyzing: CxxUnhandledExceptionFilter故障转储分析:CxxUnhandledExceptionFilter
【发布时间】:2014-03-28 14:59:23
【问题描述】:

我有一个崩溃小型转储要分析。我的程序是多线程 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”线程,我怎样才能找到程序实际失败的地方?

【问题讨论】:

    标签: c++ qt crash-dumps postmortem-debugging


    【解决方案1】:

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

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

    不幸的是,这意味着小型转储可能不包含有用的信息。

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

    查看pPtrs->ExceptionRecord->ExceptionAddress 的值,它应该包含EIP

    来自 MSDN:

    ExceptionAddress:发生异常的地址。

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

    【讨论】:

    • 哇,你回答得这么快,谢谢 :) 异常地址指向 kernelbase.dll,我可以看到它是 _RaiseException@16 函数。是内核故障吗?
    • @YuriM 哈哈,不太可能。您可能向 WinApi 函数提供了一些不正确的参数,或者您调用的代码做到了。这些函数将执行完整性检查并在不喜欢数据时抛出异常。你检查了其余的论点吗?结构中可能有调用堆栈的记录。
    • 我会在下周晚些时候做 :)
    • 我刚刚找到一篇关于如何获取堆栈跟踪的文章 - support.microsoft.com/kb/313109
    • kb-313109 是解决方案。它工作得很好,我设法做我想做的事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    相关资源
    最近更新 更多