Windows默默捕获的异常,如何手动处理?

Mar*_*ram 20 c++ windows mfc exception message-pump

当消息泵中抛出异常时,我们遇到的问题是Windows静默地吃异常并允许应用程序继续运行.例如,我们创建了一个测试MFC MDI应用程序,并覆盖了OnDraw:

void CTestView::OnDraw(CDC* /*pDC*/)
{
    *(int*)0 = 0; // Crash

    CTestDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // TODO: add draw code for native data here
}
Run Code Online (Sandbox Code Playgroud)

在运行应用程序时,您会发现一个令人讨厌的错误消息,但实际上您什么也得不到.该程序似乎运行得很好,但是如果你检查输出窗口,你会看到:

Test.exe中0x13929384处的第一次机会异常:0xC0000005:访问冲突写入位置0x00000000.
Test.exe中0x77c6ee42的第一次机会异常:0xC0150010:当前执行的线程未激活的激活上下文无效.

我知道为什么我收到应用程序上下文异常,但为什么要静默处理?这意味着我们的应用程序在使用时可能会遇到严重问题,但我们永远不会知道它,因为我们的用户永远不会报告任何问题.

Sim*_*erg 12

如果你在x64操作系统上运行,你可能会被这个问题所困扰:

http://blog.paulbetts.org/index.php/2010/07/20/the-case-of-the-disappearing-onload-exception-user-mode-callback-exceptions-in-x64/

或者(在这种情况下不太可能),它可能是这样的:http: //blogs.msdn.com/b/oldnewthing/archive/2011/01/20/10117963.aspx


Mar*_*ram 11

在浏览了类似的问题之后,我偶然发现了这个答案: OpenGL抑制了基于MFC对话框的应用程序中的异常

"好的,我发现了一些关于这个的更多信息.在我的情况下,它是安装KiUserCallbackExceptionHandler作为异常处理程序的Windows 7,然后调用我的WndProc并给我执行控制.这是由ntdll!KiUserCallbackDispatcher完成的.我怀疑这是一个安全性微软采取措施防止黑客入侵SEH.

解决方案是使用try/except帧包装你的wndproc(或hookproc)."

我已经向微软提交了一份错误报告,你可以在这里看到他们的回复:http:
//connect.microsoft.com/VisualStudio/feedback/details/550944/hardware-exceptions-on-x64-machines-are-silently-caught -in-的WndProc的消息

来自微软:

谢谢你的报道.我发现这是一个Windows问题,并且有一个热修复可用.如果您愿意,请参阅 http://support.microsoft.com/kb/976038以获取可以安装的修复程序.


Ste*_*tes 5

可能感兴趣的功能:

SetUnhandledExceptionFilter()
_set_invalid_parameter_handler()
_RTC_SetErrorFuncW()
_CrtSetReportHookW2()
Run Code Online (Sandbox Code Playgroud)

PS,请注意 SetUnhandledExceptionFilter() 可以被加载到 .exe 中的其他 dll 覆盖。例如,flash 和 nvidia direct3d 可以执行此操作。我使用 api hooking 来解决这个问题。