【发布时间】:2011-02-07 00:13:48
【问题描述】:
当异常在消息泵中抛出时,我们遇到了 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
}
在运行应用程序时,您可能会收到令人讨厌的错误消息,但实际上您什么也得不到。该程序似乎运行得很好,但是如果您检查输出窗口,您将看到:
第一次机会例外在 Test.exe 中的 0x13929384: 0xC0000005:访问冲突写入 位置 0x00000000.
0x77c6ee42 处的第一次机会异常 在Test.exe:0xC0150010: 激活上下文被停用 对当前线程不活跃 执行。
我知道为什么我会收到应用程序上下文异常,但为什么它被静默处理?这意味着我们的应用程序在使用时可能会遇到严重的问题,但我们永远不会知道,因为我们的用户永远不会报告任何问题。
【问题讨论】:
-
是的,Visual Studio 2008。
-
好的,然后在下面查看并尝试我的答案...
-
@Mark Ingram:一旦发生访问冲突,最好让您的进程快速失败。在访问冲突后继续运行会导致细微的内存损坏错误。作为客户,我对偶尔发生的崩溃比给出错误答案更宽容。要记住的事情:)
-
@Billy ONeal,应用程序正在默默地使用异常,然后继续。通过我们自己没有选择。我想要做的是拦截异常并相应地处理它(上面的崩溃应该会导致硬失败,但它不会)。
-
@Mark Ingram:那就继续吧:)
标签: c++ windows mfc exception message-pump