作者:admin发布时间:2021-10-19分类:传奇私服浏览:235评论:5
在Win7及以后的系统中如果一个程序发生了奔溃系统会弹出一个“X传奇私服弹出停止工作X已停止工作”的对话框如果不去这个窗口上点击“关闭程序”那么这个窗口会一直存在最为关键的是奔溃的进程并没有真正结束还一直挂起在那里。这在自动化无人值守程序开发中是不允许的有时候有的程序只能运行一个实例如果奔溃的这个进程一直没有真正结束新进程就无法启动。一开始我们想到的解决方案是去模拟点击这个“XX已停止工作”的对话框不过这样实在是太LOW了。
通过任务管理器查找到这个“XX已停止工作”的对话框属于进程通过查阅资料了解到这是错误报告的服务根据网上资料在服务管理器中关闭这个错误报告服务仍然会弹出停止运行的对话框。最后在MSDN上找到了的错误报告服务配置说明-()
函数当系统出现异常没有处理的时候,系统就会调用所设置异常处理函数.
当发生异常时比如内存访问违例时CPU硬件会发现此问题并产生一个异常你可以把它理解为中断
然后CPU会把代码流程切换到异常处理服务例程。操作系统异常处理服务例程会查看当前进程是否处于调试状态
如果是则通知调试器发生了异常如果不是则操作系统会查看当前线程是否安装了的异常帧链(FS[0])如果安装了SEHtry....catch....则调用SEH并根据返回结果决定是否全局展开或局部展开。如果异常链中所有的SEH都没有处理此异常而且此进程还处于调试状态则操作系统会再次通知调试器发生异常二次异常。如果还没人处理则调用操作系统的默认异常处理代码UnhandledExceptionHandler不过操作系统允许你Hook这个函数就是通过SetUnhandledExceptionFilter函数来设置。大部分异常通过此种方法都能捕获不过栈溢出、覆盖的有可能捕获不到。
LPTOP_LEVEL_EXCEPTION_FILTERWINAPISetUnhandledExceptionFilter(_In_LPTOP_LEVEL_EXCEPTION_FILTERlpTopLevelExceptionFilter
);
参数lpTopLevelExceptionFilter函数指针。当异常发生时且程序不处于调试模式在vs或者别的调试器里运行则首先调用该函数。
EXCEPTION_EXECUTE_HANDLERequ1表示我已经处理了异常,可以优雅地结束了
EXCEPTION_CONTINUE_SEARCHequ0表示我不处理,其他人来吧,于是windows调用默认的处理程序显示一个错误框,并结束
EXCEPTION_CONTINUE_EXECUTIONequ-1表示错误已经被修复,请从异常发生处继续执行
注意在调用者进程中的所有线程已经将来创建的线程的异常处理链顶函数都会被修改为当前设定的回调函数。
使用示例
#includewindows.hlong__stdcallcallback(_EXCEPTION_POINTERS*excp){returnEXCEPTION_EXECUTE_HANDLER;}intmain(intargc,char*argv[]){SetUnhandledExceptionFilter(callback);char*p0;*paaa//让程序崩溃用来测试return0;}
已有5位网友发表了看法: