【问题标题】:run-time error and program crash运行时错误和程序崩溃
【发布时间】:2010-06-08 23:47:58
【问题描述】:

如何指定一个单独的函数,在运行时出错时自动调用以防止程序崩溃?

【问题讨论】:

  • 防止程序崩溃是什么意思?请记住,某些运行时错误是不可恢复的,您希望发生什么?
  • 在几乎所有可以想象的情况下,正确的做法是修复代码,使其不会导致运行时错误
  • @James 不幸的是,有些情况下需要实现某种运行时错误日志记录,以便您了解需要修复的问题
  • @David:这可能是真的,但这里的意图是“防止程序崩溃”。

标签: c++


【解决方案1】:

如前所述,最好的办法是确定崩溃 ic 发生的区域,然后修复这段代码。这是理想主义的方法。

如果您无法找到另一种选择,那就是在您怀疑发生崩溃的区域进行结构化异常处理。一旦发生崩溃,您就可以捕获您想要的任何数据并进行处理。同时,您可以更改 Windows 服务管理器中的设置,以便在应用程序崩溃时重新启动应用程序。希望这能回答您的问题。

如果您正在寻找捕获崩溃和分析的方法,则 debugdiag 和 windbg 是人们用来获取崩溃转储的一些标准工具。

【讨论】:

  • OP 提到了“程序崩溃”。我想,只有当“程序”是 Windows 服务时,Windows 服务管理器的重启选项才有帮助。
  • 嗯,没错。我认为我们需要等到该人澄清它是一个进程还是一个程序。
  • arpal - 这是进程(主线程)崩溃。在实时应用程序中,这种功能的存在对于在发生不可预测的运行时错误时恢复计算机操作非常重要。
  • 你的意思是说你的进程正在崩溃?
【解决方案2】:

如果您在 Windows 中,您需要编写自己的自定义运行时检查处理程序。使用:

 _RTC_SetErrorFunc 

安装您的自定义函数来代替

_CrtDbgReport.  

这是一篇关于如何做到这一点的好文章:

http://msdn.microsoft.com/en-us/library/40ky6s47(VS.71).aspx

【讨论】:

  • 谢谢。对于未捕获的异常,是否有任何 C++ 方法,例如 set_terminate() 函数?
  • 可移植的方法是安装一个信号处理程序,使用来自<csignal>signal 函数。但是,这不能用于从运行时错误中恢复。
  • @arpal 我不知道有任何 C++ 方法可以做到这一点 - 但是,如果它是运行时异常,那么它不是 C++ 问题 - 操作系统级别的方法是唯一的干预方式
  • arpal- 我不同意你的看法。为什么 C++ 在未捕获异常的情况下提供终止处理函数?处理运行时错误也可以这样做。
【解决方案3】:

如果运行时错误是指未处理的异常,不要这样做。如果未经处理的异常通过您的代码传播,您希望您的应用程序崩溃。也许在下降的过程中创建一个转储文件,当然。但是你最不想做的就是捕获异常,什么都不做,然后继续运行,就好像一开始什么都没发生一样。

当产生异常时,任何导致问题的因素都可能产生其他影响。就像炸毁堆栈或破坏堆一样。如果您要默默地忽略这些异常并继续运行,您的应用程序可能会运行一段时间并且看起来不错,但下面的某些东西是不稳定的。内存可能损坏,资源可能不可用,谁知道呢。你最终会崩溃。忽略未处理的异常并继续运行,您所做的只是延迟不可避免的问题,并使诊断真正的问题变得更加困难,因为当你崩溃时,堆栈将处于完全不同的状态并且可能与导致最初问题的原因无关。

【讨论】:

    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 2015-10-29
    相关资源
    最近更新 更多