最近做一个系统,程序不声不响的退出,可在调试的时候没事。
有时,冷不丁的,退出了,由于是后台运行程序,还没有注意呢!
我的意思是,有什么工具或方法可以找到它的原因。
这是软件健壮性的一个考量,很重要。
另外,程序崩溃了重要通知我一下呀,任何软件都可能崩溃(也可能因为非本软件的原因)。至少最好要健壮些,有好些才对得起观众。

解决方案 »

  1.   

    程序创建的时候设置:
    SetUnhandledExceptionFilter(EXCEPTION_FUNCTION)
    其中EXCEPTION_FUNCTION是回调函数:
    SetUnhandledExceptionFilter
      设置异常捕获函数.
      当异常没有处理的时候,系统就会调用SetUnhandledExceptionFilter所设置异常处理函数.
      例如一些程序在出错的时候,会向用户报告说程序那出错就是利用这个.例如QQ..
      异常处理中的一部分
      当发生异常时,比如内存访问违例时,CPU硬件会发现此问题,并产生一个异常(你可以把它理解为中断)
      然后CPU会把代码流程切换到异常处理服务例程。操作系统异常处理服务例程会查看当前进程是否处于调试状态
      如果时,则通知调试器发生了异常,如果不是则操作系统会查看当前线程是否安装了的异常帧链(FS[0]),如果安装了SEH(try.... catch....),则调用SEH,并根据返回结果决定是否全局展开活局部展开。如果异常链中所有的SEH都没有处理此异常,而且此进程还处于调试状态,则操作系统会再次通知调试器发生异常(二次异常)。如果还没人处理,则调用操作系统的默认异常处理代码UnhandledExceptionHandler,不过操作系统允许你Hook这个函数,就是通过SetUnhandledExceptionFilter函数来设置。大部分异常通过此种方法都能捕获,不过栈溢出、覆盖的有可能捕获不到。
      大部分保护壳都采用异常处理技术,跳出正常的代码指令流程,来迷惑Cracker。
      

  2.   

    最近正在看结构化异常的资料,还不知道系统默认的处理是调用UnhandledExceptionHandler,又学到一招,呵呵