加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么win32计时器回调中抛出的未处理异常未被调试器视为未

发布时间:2020-12-16 09:39:53 所属栏目:百科 来源:网络整理
导读:我一直在追踪工作中一个非常阴险的错误.似乎导致我一直在跟踪的非常奇怪的行为的事件似乎是在处理计时器回调时抛出的异常.异常不是由我的任何代码处理的,因此我希望调试器会收到未处理异常的通知,并提醒我一个好的令人讨厌的弹出窗口.不,相反,“第一次机会”
我一直在追踪工作中一个非常阴险的错误.似乎导致我一直在跟踪的非常奇怪的行为的事件似乎是在处理计时器回调时抛出的异常.异常不是由我的任何代码处理的,因此我希望调试器会收到未处理异常的通知,并提醒我一个好的令人讨厌的弹出窗口.不,相反,“第一次机会”异常消息会追溯到调试器,并且所有内容都会静默移动.

我写了以下程序来演示这个问题:

#include "stdafx.h"
#include <Windows.h>

class FooExcept
{
};

VOID CALLBACK Timer(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
    printf("Heren");
    throw FooExcept();
    printf("Also Heren");
}


int _tmain(int argc,_TCHAR* argv[])
{
    SetTimer(0,1000,Timer);

    int bRet;
    HWND hWnd;
    MSG msg;
    // Standard Win32 message pump
    while( (bRet = GetMessage( &msg,NULL,0 )) != 0)
    { 
        if (bRet == -1)
        {
            // handle the error and possibly exit
        }
        else
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        }
    }

    return 0;
}

此程序到Visual Studio输出窗口的输出是重复的:

First-chance exception at 0x76dbb9bc in TimerTest.exe: Microsoft C++ exception: FooExcept at memory location 0x0034f743..

当然,我的项目更加复杂,并且正在向调试器打印出大量的TRACE信息.第一次机会异常很容易在输出中丢失.

然而

那不是我关心的问题.这显然是一个例外,我没有处理. Windows是否偷偷地决定为我处理这个问题?为什么?如果没有,为什么不给我一个明确的弹出窗口警告我未处理的异常?这样的弹出窗口可以节省我几天的调试时间.

XP / VS 2008和Win7 / VS 2010之间的这种行为似乎是一致的.

解决方法

在Windows 7 SP1中,这已在某种程度上得到修复(见下文).

在文章http://support.microsoft.com/kb/976038中,您将找到一个错误修正的提及,并解释如何使用它来禁用此行为.你必须要么:

>在注册表中设置流程选项或
>调用kernel32.dll导出的函数SetProcessUserModeExceptionPolicy

我在Updates in Win7 and WS08R2 SP1.xls中验证过这个错误修复确实包含在Windows 7 Service Pack 1中,因此您所要做的就是启用它(假设您已经安装了Windows 7 SP1).

至于解释为什么这样做,我们可以猜测一些不明智的尝试,以防止遗留应用程序以向后兼容性的名义崩溃.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读