项目大了代码多了以后难免会出些问题导致程序崩溃,为了快速定位崩溃的地址与原因,引入了SetUnhandledExceptionFilter这个API。
久了后发现这个API有些情况下无法WORK,异常会被其他异常处理接管。这样就无法定位到自己的崩溃原因。后面查了下,大致是在新的msvcr.dll中会接管异常处理,它们不关心的部分才会丢给我们,比如说_set_invalid_parameter_handler,_set_purecall_handler这些东西等等。索性直接把SetUnhandledExceptionFilter挂起接管过来,在调用它的地方全都直接返回true。
大致的代码如下:
::SetUnhandledExceptionFilter(CCrashDump::TopLevelExceptionFilter);
unsigned char code[16];
int size = 0;
code[size++] = 0x33;
code[size++] = 0xc0;
code[size++] = 0xc2;
code[size++] = 0x04;
code[size++] = 0x00;
DWORD dw = 0;
DWORD dwOldFlag, dwTempFlag;
VirtualProtect(SetUnhandledExceptionFilter, size, PAGE_READWRITE, &dwOldFlag);