SetUnhandledExceptionFilter 捕捉不到线程类里的异常

samuelo 2010-03-11 02:49:56
设置全局异常处理。SetUnhandledExceptionFilter返回非0,表示成功。
线程类中一段测试代码:
{
CA* p;
delete p; //异常
}
然而,全局异常函数没有捕捉到这个异常。程序照样运行。我晕!
测试代码改成:
{
int k = 0;
int j = 9;
int m = j / k; //异常
}
仍然捕捉不到。

请问是什么原因?
...全文
451 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
AtmanGuardian 2011-07-12
  • 打赏
  • 举报
回复
使用VS2005(VC8)+编译的程序,许多错误都不能在SetUnhandledExceptionFilter捕获到
void DisableSetUnhandledExceptionFilter()
{
void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")), "SetUnhandledExceptionFilter");
if (addr)
{
unsigned char code[16];
int size = 0;
code[size++] = 0x33;
code[size++] = 0xC0;
code[size++] = 0xC2;
code[size++] = 0x04;
code[size++] = 0x00;
DWORD dwOldFlag, dwTempFlag;
VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);
}
}
samuelo 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 starsunyzl 的回复:]
Release下捕获不到测试1,但程序也没出错,可能是代码太简单被编译器优化掉了。
[/Quote]

是的,我也奇怪,为什么会被程序忽略掉。
已经测试出SetUnhandledExceptionFilter可以捕捉线程异常。之前捕捉不到,就是因为程忽略了我造的2个异常。
StarsunYzL 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 samuelo 的回复:]
你的异常不是在线程里。
[/Quote]

在线程里也正常,输出你的指针的值看看是不是为0,是的话就给指针赋一个非0的初始值再试试,因为delete 0是合法的:


#include <iostream>
#include <tchar.h>
#include <Windows.h>

LONG WINAPI MyUnhandledExceptionFilter(_EXCEPTION_POINTERS* ExceptionInfo)
{
std::cout << "UnhandledExceptionFilter" << std::endl;
return EXCEPTION_CONTINUE_SEARCH;
}

DWORD CALLBACK Thread(LPVOID lpParam)
{
// 禁用异常对话框
//_CrtSetReportMode(_CRT_ASSERT, 0);
//_CrtSetReportMode(_CRT_ERROR, 0);
//_CrtSetReportMode(_CRT_WARN, 0);

//测试1
int* p = (int*)1;
delete p;
std::cout << p << std::endl;
//测试2
//int k = 0;
//int j = 9;
//int m = j / k; //异常
//std::cout << m << std::endl;

return 0;
}

int _tmain(int argc, TCHAR* argv[])
{
SetUnhandledExceptionFilter(&MyUnhandledExceptionFilter);
CreateThread(NULL, 0, &Thread, NULL, 0, NULL);

_tsystem(_T("pause"));
return 0;
}


Release下捕获不到测试1,但程序也没出错,可能是代码太简单被编译器优化掉了。

.
wjw704486377 2010-03-11
  • 打赏
  • 举报
回复
学习。。。
samuelo 2010-03-11
  • 打赏
  • 举报
回复
你的异常不是在线程里。
StarsunYzL 2010-03-11
  • 打赏
  • 举报
回复
VS2008 SP1新建默认解决方案,测试Debug和Release下都工作正常啊:

LONG WINAPI MyUnhandledExceptionFilter(_EXCEPTION_POINTERS* ExceptionInfo)
{
std::cout << "UnhandledExceptionFilter" << std::endl;
return EXCEPTION_CONTINUE_SEARCH;
}

int _tmain(int argc, TCHAR* argv[])
{
SetUnhandledExceptionFilter(&MyUnhandledExceptionFilter);

int* p;
delete p;
std::cout << p << std::endl;
//int k = 0;
//int j = 9;
//int m = j / k; //异常
//std::cout << m << std::endl;
return 0;
}

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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