现在有很多程序比如QQ、IE在自己崩溃的时候能知道崩溃时的地址等信息并且能重新启动是如何实现的?

解决方案 »

  1.   

    就“崩溃”来说可以用IE来举个例子,当IE6出现致命错误时会出现一个对话框上面显示崩溃时的现场信息还问你是否把这个Bug报告给MS(发送或不发送)。
      

  2.   

    可以开个外部线程(在新开的进程中)监视它,崩溃了就调用执行被监视的EXE
      

  3.   

    我猜想是不是这样:如yintongshun(左岸思雨)所说,开个外部线程进行监视,出错时,可以调用GETLASTERROR函数获得出错原因,并提示。然后重新执行崩溃的程序。
      

  4.   

    IE6是Dr Watson监视的
    程序自身控制的话不清楚 最简单就是启动一个守护进程
      

  5.   

    最简单的一个实现是用两个进程,一个进程是守护进程,负责启动真正的工作进程,并定时检查工作进程是否正常,如果已经崩溃了的话那么重启。IE6和QQ的做法不向是用这种方法(因为看不到守护进程)。另一个可能的做法是使用结构化异常(SEH),在进程的如何开始捕获全部异常,当捕获到异常之后启动一个新的进程,然后程序结束,新启动的进程等待发生异常的进程推出完毕之后,重新启动新的进程,然后自己推出。IE6 running
    -->IE6 catch SEH
    -->start IE6Createor
    -->IE6Creator wait IE6 quit
    -->IE6Creator start IE6
    IE6 running
    IE6Creator exit
      

  6.   

    重新启动自己,倒不是问题,怎么得知自己发生错误的地址,好像不是什么GETLASTERROR能报出来的吧!
      两者应该都不是启用守护进程!
    我以前看过一个帖子,好像也是开一个线程监视程序如果是非正常关闭,就自动重启的功能!
      

  7.   

    to:ncucf(ncu晨风) 
    重新启动自己?是如何实现的?能贴出代码来看看吗?
      

  8.   

    __try{
    }
    __except(
    GetExceptionInformation(),
    EXCEPTION_EXECUTE_HANDLER)
    {
    }
      

  9.   

    我不知道IE和QQ是怎么做的,但我可以讲一下我做的一个程序的实现方法,是为联通公司做的提供话单查询的SOCKET服务程序,主要服务的客户是营业厅的自助话单查询机,需要支持上百个并发服务请求。连接数据库,接到客户请求连接新开线程,内存分配全部使用结构化异常(SEH),数据库查询出错就断开连接重来,至今没出现过什么问题。自己进行压力测试的时候,偶尔有崩溃,都是长时间运行后出现,但问题不可重现,查看日志也没见异常,这是最头疼的事情,估计是内存碎片的问题。于是catch到异常的时候把一些关键变量的值,内存地址等信息记录到日志,倒真发现一个BUG,因为那时候要访问所有关键的数据,当有跑飞的指针时程序崩溃,无法记录日志了,查看日志记录到哪一个数据,那么接下来要记录但没记录下来的数据就有问题了。改完BUG后好多了,但虽然很难得却还是会有崩溃,这时候再看日志却什么问题也看不出来了,而且这种情况都是压力测试时模拟200个客户7*24运行出现,一般最少一两个星期才会出现,有时却一两个月没有问题,实在没法调了。程序交付运行到现在倒没出现过问题,一个是运行时没有测试时那么大压力,还有可能是跟联通的服务器好有关。但我知道会有崩溃现象,所以在catch到不可恢复的异常时重启服务,写这段代码的时候也不知怎么会突然想到万一需要重启,先退出时系统报一个出错对话框阻塞退出怎么办,这时候只能人工解决,于是加了一段发短消息通知管理员的代码,还真有效,测试时有一次崩溃我还真收到短消息了。不过还是查不出出错原因,但现在至少程序出错的时候我能知道了:)
      

  10.   

    我觉得是实现方法可能很多,正如windows的机制一样,也可以实现大多数的程序执行时的错误检测,自己实现它也未尝不可,使用几个进程也没什么关系!
      

  11.   

    MSDN ---> PE Image Helper (ImageHlp) Overview 里面什么都有了。或者找个 blackbox 地源码看看。
      

  12.   

    http://expert.csdn.net/Expert/topic/2658/2658693.xml?temp=.1963465我的问题.看对你有帮助没有?
      

  13.   

    SEH我基本明白了,现在的问题是如何重新启动程序?