SetUnhandledExceptionFilter的执行问题

chenyu2202863 2009-08-27 11:17:40
我想把这个函数封装在一个类中,用静态成员自动构造和析构.
然而,据MSDN说这个函数必须在main/wWinManCRTStartup...开始的地方执行.

那我就不能在其他地方使用了吗?我测试了下,如果是静态成员自动构造时调用此函数,然后故意造个访问异常,但是并没有捕获到此异常.还是通常的一个中断产生.

有什么好办法吗?
...全文
448 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
野男孩 2009-08-29
  • 打赏
  • 举报
回复
嗯,在调试器里面的话,异常总是会被调试器拿到。
chenyu2202863 2009-08-28
  • 打赏
  • 举报
回复
我的环境是XP sp3 + vs2008
chenyu2202863 2009-08-28
  • 打赏
  • 举报
回复
捕捉不到啊,还有阿,我利用try catch,设置了_set_se_handler后,还是不能捕捉到访问异常之类的异常

怎么回事呢?
雪影 2009-08-28
  • 打赏
  • 举报
回复
只要不是在静态或全局变量的构造函数中使用,其他的地方都可以使用啊。
进程都能扑捉到这个异常的。
chenyu2202863 2009-08-28
  • 打赏
  • 举报
回复
那我用MFC,在哪个函数里调用合适呢?

我希望能捕获到多线程里没有处理的异常
chenyu2202863 2009-08-28
  • 打赏
  • 举报
回复
我只能最后顶一次了~
有人吗?
chenyu2202863 2009-08-28
  • 打赏
  • 举报
回复
然后,我在CXXPP::InitInstance中调用UnHandledExceptionFilter::Install();

然后测试代码为:
char *pBuf = NULL;
*pBuf = 0;

现在,总是调试环境给我报错,而不是出MessageBox
chenyu2202863 2009-08-28
  • 打赏
  • 举报
回复

#ifndef __UNHANDLED_EXCEPTION_FILTER_H
#define __UNHANDLED_EXCEPTION_FILTER_H




class UnHandledExceptionFilter
{
public:
UnHandledExceptionFilter()
{

}

~UnHandledExceptionFilter()
{
::SetUnhandledExceptionFilter(NULL);
}

static void Install()
{
::SetUnhandledExceptionFilter(MyHandledExceptionFilter);
}

private:
UnHandledExceptionFilter(const UnHandledExceptionFilter &);
UnHandledExceptionFilter &operator=(const UnHandledExceptionFilter &);

public:
static LONG WINAPI MyHandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
DWORD dwExceptionCode = pExceptionInfo->ExceptionRecord->ExceptionCode;
switch( dwExceptionCode )
{
case EXCEPTION_ACCESS_VIOLATION:
MessageBox(NULL, _T("EXCEPTION_ACCESS_VIOLATION"), NULL, MB_OK);
break;
case EXCEPTION_DATATYPE_MISALIGNMENT:
break;
case EXCEPTION_BREAKPOINT:
break;
default:
break;
}

MessageBox(NULL, _T("Catch a EXCEPTION"), NULL, MB_OK);

return EXCEPTION_EXECUTE_HANDLER;
}

//static UnHandledExceptionFilter m_Single;
};


//UnHandledExceptionFilter UnHandledExceptionFilter::m_Single;


#endif
jyh_baoding 2009-08-28
  • 打赏
  • 举报
回复
查查程序,看调用什么了
野男孩 2009-08-28
  • 打赏
  • 举报
回复
你把测试代码贴上来吧。

建议看看John Robbins的一本老书《Debugging Windows》,有专门提到异常处理的问题。

另外,记得MattPietrik好像是在1997年的MSDN上也发过exception handler的系列文章,可以看看。比较老了,找不到的话可以给我发消息,我发给你
chenyu2202863 2009-08-28
  • 打赏
  • 举报
回复
噢,这样啊,我试试~
ziplj 2009-08-28
  • 打赏
  • 举报
回复
SetUnhandledExceptionFilter 拿到DEBUG的权限是小于VS的 必须要直接运行 才能Dump文件出来
ziplj 2009-08-28
  • 打赏
  • 举报
回复
我邮箱在那个帖子说了 你发给我看看
chenyu2202863 2009-08-28
  • 打赏
  • 举报
回复
全局也一样,就是不进去~,每次都是调试环境先捕捉到!
ziplj 2009-08-28
  • 打赏
  • 举报
回复
没看明白你为什么要MyHandledExceptionFilter放在类里面做 你把它放在全局做看看??
雪影 2009-08-27
  • 打赏
  • 举报
回复
用静态成员自动构造和析构.调用SetUnhandledExceptionFilter函数,这都是都是在main外部调用,因此进程没办法扑捉到该异常信息吧。只能交给系统处理,从而产生中断。

你是不是想扑捉到静态成员变量构造和析构时的异常啊?我也不知道有什么办法。
SetUnhandledExceptionFilter函数也只有放在main函数运行时才能扑捉到这个异常吧。
chenyu2202863 2009-08-27
  • 打赏
  • 举报
回复
我的意思是,不管放在哪个位置,只要能正常(能优先捕获到程序异常,而不是系统捕获到)工作.
雪影 2009-08-27
  • 打赏
  • 举报
回复
好像没有办法扑捉全局变量初始化时的异常。
静态成员变量也是在main函数之前初始化的吧,相当于全局变量。异常也没有办法扑捉的
雪影 2009-08-27
  • 打赏
  • 举报
回复
好像没有办法扑捉全局变量的异常。
静态成员变量也是在main函数之前初始化的吧,相当于全局变量。异常也没有办法扑捉的

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧