我知道,如果有足够的上下文,我们可以希望从段落状态中有build设性的使用(即恢复)。
但是,这是值得的吗? 如果是,在什么情况下?
你不能真的希望从段错误中恢复。 您可以检测到发生的情况,并尽可能转储出相关的应用程序特定状态,但无法继续此过程。 这是因为(其中包括)
所以总的来说,除了以相当突然的方式终止这个过程之外,没有任何意义可以阻止它并做任何事情。 尝试将(重要的)数据写回光盘或继续做其他有用的工作是毫无意义的。 将状态转储到日志(有许多应用程序需要做)然后退出是有一定的意义的。
一个可能有用的事情可能是exec()你自己的进程,或者有一个看门狗进程在崩溃的情况下重新启动它。 (注意:如果进程拥有> 1个线程,exec并不总是有明确的行为)
一些原因:
分段错误实际上是访问你没有权限访问的内存(或者是因为它没有被映射,你没有权限,无效的虚拟地址等等)。
根据潜在的原因,您可能想要陷阱和处理分段错误。 例如,如果你的程序通过一个无效的虚拟地址,它可能会记录该段错误,然后做一些损害控制。
段错误并不一定意味着程序堆已损坏。 读取无效地址(例如空指针)可能会导致段错误,但这并不意味着堆已损坏。 此外,根据C运行时,应用程序可能有多个堆。
如果您知道分段错误不是错误,那么可以通过捕获分段错误来实现非常先进的技术。 例如,您可以保护页面,使其不能读取它们,然后在读取完成之前捕获SIGSEGV以执行“神奇”的行为。 (请参阅TomaszWęgrzanowski“将自己的程序设计为趣味和盈利”作为您可能做的一个例子,但通常开销相当高,所以不值得做。)
类似的原理适用于捕获非法指令异常(通常在内核中)以模拟在处理器上未实现的指令。
例如,记录崩溃堆栈跟踪。
不,我认为这是浪费时间 – seg错误表示代码有问题,建议您通过检查核心转储和/或源代码来找到它。 有一次,我试图捕获一个seg故障,导致我进入了一个镜像的大厅,我可以通过简单地考虑源代码来避免这个镜像。 再也不。