SetUnhandledExceptionFilter的执行问题

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

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

有什么好办法吗?
...全文
371 点赞 收藏 19
写回复
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函数之前初始化的吧,相当于全局变量。异常也没有办法扑捉的
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告