【问题标题】:How to reload a crashed process on Windows如何在 Windows 上重新加载崩溃的进程
【发布时间】:2010-10-14 16:25:54
【问题描述】:

如何在 Windows 上重新加载崩溃的进程?当然,我可以运行自定义监控Win服务进程。但是,比如火狐:它好像没有安装这种东西,但是当它崩溃时它仍然可以重新启动。

【问题讨论】:

  • 怎么和编程不完全相关?
  • @Mitch:是的,我也想澄清一下。

标签: winapi process crash reload


【解决方案1】:

每次您打开选项卡或单击链接或执行其他操作时,Firefox 都会不断地将其状态保存到硬盘上。它还保存了一个标志,表明它已安全关闭。

在启动时,它会读回所有内容,并能够根据该信息“恢复”。

【讨论】:

    【解决方案2】:

    在 Vista 及更高版本上,您可以使用 RegisterApplicationRestart API 在崩溃或挂起时自动重启。

    在 Vista 之前,您需要有一个顶级异常过滤器来执行重新启动,但请注意,在受感染进程内运行代码并不完全安全或可靠。

    【讨论】:

      【解决方案3】:

      如果我没记错的话,Windows 至少实现了 POSIX 的某些子集,因此“必须”具有信号接口(例如 SIGKILL、SIGSEGV、SIGQUIT 等)。

      我从来没有这样做过,但在 linux 上,但您可以尝试使用 signal() (signal.h) 设置意外终止陷阱。 从文档的快速扫描看来,在处理信号时可以做的事情很少,甚至有可能启动一个新进程也在禁止列表中。

      现在我已经考虑过了,我可能会选择 master/worker 模式,这是非常简单的父线程,除了生成 worker 之外什么都不做(完成所有 UI / 其他事情)。如果它没有设置特定的“我现在要死了”位但仍然死了(父进程总是收到消息/通知说生成的进程死了)然后主重生工人。主题是保持大师非常简单,很难因为自己的错误而死。

      【讨论】:

        【解决方案4】:
        • Structured exception handling (SEH) 允许您捕获程序崩溃并在发生时执行某些操作。
          见:__try and __except
          SEH 可能非常危险,并且可能导致您的程序挂起。请参阅this article 了解更多信息。

        • 如果您将程序编写为 NT 服务,那么您可以将第一次、第二次和随后的失败操作设置为“重新启动服务”。

        • 对于 Windows 2008 服务器和 Windows Vista 和 Windows 7,您可以使用 Win32 API RegisterApplicationRestart

        有关处理不同类型的程序崩溃的更多信息,请参阅my answer here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-03-09
          • 1970-01-01
          • 2014-04-19
          • 1970-01-01
          • 1970-01-01
          • 2014-07-24
          • 1970-01-01
          相关资源
          最近更新 更多