69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <setjmp.h>
jmp_buf mark;
long WINAPI ExceptionFilter(EXCEPTION_POINTERS* lParam) //发生异常后,最终会跑到这里来
{
longjmp(mark, 1); //跳回到setjmp的位置,并且返回值会是1
return 1;
}
int main(int argc, char** argv[])
{
LPTOP_LEVEL_EXCEPTION_FILTER lpOldExceptionFilter = NULL;
int jmpret = 0;
jmpret = setjmp(mark); //记录当前的各个寄存器的信息,此刻返回值会是0
if (jmpret == 0)
{
lpOldExceptionFilter = SetUnhandledExceptionFilter(ExceptionFilter); //注册异常回调函数
_asm int 3;
printf("正常!\r\n");
}
SetUnhandledExceptionFilter(lpOldExceptionFilter); //还原原先的异常回调函数
if (jmpret != 0) //jmpret不是0代表发生过异常
{
printf("异常!\r\n");
}
system("PAUSE");
return 0;
}
#include <stdio.h>
#include <windows.h>
int i=0;
int *p=NULL;
long WINAPI ExceptionFilter(EXCEPTION_POINTERS * lParam)
{
puts("DADA...");
return 1;
}
int main()
{
SetUnhandledExceptionFilter(ExceptionFilter);
__asm int 3;
return 0;
}