【发布时间】:2009-12-23 21:14:41
【问题描述】:
我知道,如果有足够的上下文,人们可能希望从 segfault 条件中建设性地使用(即恢复)。
但是,这些努力值得吗?如果是,在什么情况下?
【问题讨论】:
我知道,如果有足够的上下文,人们可能希望从 segfault 条件中建设性地使用(即恢复)。
但是,这些努力值得吗?如果是,在什么情况下?
【问题讨论】:
您不能真正希望从段错误中恢复。您可以检测到它发生了,并在可能的情况下转储出相关的特定于应用程序的状态,但您无法继续该过程。这是因为(除其他外)
因此,一般来说,捕获它并做任何事情都是没有意义的,除非以相当突然的方式终止进程。尝试将(重要)数据写回磁盘或继续做其他有用的工作是没有意义的。将状态转储到日志(许多应用程序都会这样做)然后退出是有一定意义的。
一个可能有用的事情可能是 exec() 你自己的进程,或者有一个看门狗进程在崩溃的情况下重新启动它。 (注意:如果您的进程有 >1 个线程,则 exec 并不总是具有明确定义的行为)
【讨论】:
原因有很多:
【讨论】:
a Segmentation Fault 确实在访问您无权访问的内存(或者因为它没有被映射,您没有权限,虚拟地址无效等)。
根据根本原因,您可能希望捕获并处理分段错误。例如,如果您的程序传递了一个无效的虚拟地址,它可能会记录该段错误,然后进行一些损坏控制。
段错误不一定意味着程序堆已损坏。读取无效地址(例如空指针)可能会导致段错误,但这并不意味着堆已损坏。此外,一个应用程序可以有多个堆,具体取决于 C 运行时。
【讨论】:
如果您知道分段错误不是错误,则可以通过捕获分段错误来实现非常先进的技术。例如,您可以保护页面,使您无法从中读取,然后在读取完成之前捕获 SIGSEGV 以执行“神奇”行为。 (请参阅Tomasz Węgrzanowski "Segfaulting own programs for fun and profit" 了解您可能会做什么的示例,但通常开销非常高,因此不值得这样做。)
类似的原则适用于捕获非法指令异常(通常在内核中)以模拟未在您的处理器上实现的指令。
【讨论】:
例如,记录崩溃堆栈跟踪。
【讨论】:
没有。我认为这是浪费时间 - 段错误表明您的代码中有问题,建议您通过检查核心转储和/或源代码来找到它。有一次我试图捕获一个 seg 错误导致我进入一个镜子大厅,我可以通过简单地考虑源代码来避免这种情况。再也不会了。
【讨论】: