我知道,只要有足够的上下文,就可以希望在段错误条件下进行 build 性使用(即恢复)。

但是,付出努力值得吗?如果是,在什么情况下?

最佳答案

您真的不能希望从段错误中恢复过来。您可以检测到它发生了,并在可能的情况下转储相关的特定于应用程序的状态,但是您无法继续该过程。这是因为(以及其他)

  • 失败的线程无法继续,因此您唯一的选择是longjmp或终止线程。在大多数情况下,两者都不安全。
  • 不管哪种方式,您都可以将互斥锁/锁定保持在锁定状态,这会使其他线程永远等待
  • 即使没有发生,您也可能泄漏资源
  • 即使您不执行上述任何一项操作,遇到故障的段隔离线程也可能使应用程序的内部状态不一致。内部状态不一致可能会导致数据错误或其他进一步的不良行为,这比直接退出
  • 会导致更多问题

    因此,总的来说,除了以相当突然的方式终止进程之外,没有任何必要诱捕它并做任何事情。试图将(重要的)数据写回到磁盘或继续做其他有用的工作没有任何意义。将状态转储到日志中有一点-许多应用程序都会这样做-然后退出。

    可能有用的事情可能是执行exec()您自己的进程,或者让一个监视程序在崩溃的情况下将其重新启动。 (注意:如果您的进程具有> 1个线程,则exec并不总是具有良好定义的行为)

    关于linux - 诱捕 "segfault"有什么意义吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1955347/

    10-10 04:23