恼人的程序崩溃框,如何解决,当然正道还是努力调试你的程序,找出BUG所在。
不过这里要介绍的是消极处理办法,即如何消除这个崩溃框。
其实很简单,也有很多方式:
1,在程序启动时用一句SetErrorMode(SEM_NOGPFAULTERRORBOX);
它就可以实现不让那个崩溃框弹出来,而是直接关闭程序,进程莫名消失。
当然你若想让进程始终运行,那就另外弄个检测程序,一分钟检查一次,若进程没有就重新运行。也是xyntservice开源软件既能把进程弄成服务方式运行,也能定期检查程序在不在。
2,自己注册一个函数,用于处理这种没人管的异常崩溃。
LONG WINAPI myUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
//自己的其它处理,如保存错误记录文件,启动一个新的本程序
return EXCEPTION_EXECUTE_HANDLER; //表示直接退出程序
}
程序启动时调用 SetUnhandledExceptionFilter(myUnhandledExceptionFilter);
这样我们就可以记录下出错的信息(包括汇编代码位置,寄存器值等),便于分析。而且这样退出同样不会让人看到出错框,还能马上就重启一个新的程序,减少程序中断时间。
3,如果想霸道的让程序继续运行,管他有什么错,或许这个错并不严重,继续转下去又好了呢。怎么办,VB可是有个on error resume next的功能。VC编的程序如何坏了还要继续向下运行。
这就需要改一下刚才的异常处理函数,仅仅是先修改当前EIP(指令寄存器)位置,然后返回继续执行。
LONG WINAPI myUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
ExceptionInfo->ContextRecord->Eip += X86IL(ExceptionInfo->ContextRecord->Eip,...);
return EXCEPTION_CONTINUE_EXECUTION;
}
OK,X86IL是判断某地址处汇编指令长度的。
以上介绍了几个解决崩溃框的处理办法,记住上策还是努力解决程序问题。