程序崩溃的处理

恼人的程序崩溃框,如何解决,当然正道还是努力调试你的程序,找出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是判断某地址处汇编指令长度的。

以上介绍了几个解决崩溃框的处理办法,记住上策还是努力解决程序问题。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭