设置全局异常处理。SetUnhandledExceptionFilter返回非0,表示成功。
线程类中一段测试代码:
{
CA* p;
delete p; //异常
}
然而,全局异常函数没有捕捉到这个异常。程序照样运行。我晕!
测试代码改成:
{
int k = 0;
int j = 9;
int m = j / k; //异常
}
仍然捕捉不到。请问是什么原因?
线程类中一段测试代码:
{
CA* p;
delete p; //异常
}
然而,全局异常函数没有捕捉到这个异常。程序照样运行。我晕!
测试代码改成:
{
int k = 0;
int j = 9;
int m = j / k; //异常
}
仍然捕捉不到。请问是什么原因?
{
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;
}
在线程里也正常,输出你的指针的值看看是不是为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,但程序也没出错,可能是代码太简单被编译器优化掉了。.
是的,我也奇怪,为什么会被程序忽略掉。
已经测试出SetUnhandledExceptionFilter可以捕捉线程异常。之前捕捉不到,就是因为程忽略了我造的2个异常。
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);
}
}