信号处理程序(segv)无法在设备崩溃之前完成

时间:2015-08-10 06:30:40

标签: linux segmentation-fault signals

我安装了一个处理程序(比如,crashHandler()),它有一些文件输出功能。它是一个linux线程,它使用crashHandler()注册SIGSEGV。需要进行文件写入,因为它将堆栈跟踪存储到持久存储    它大部分时间都有效。但在特定情况下,函数(crashHandler())部分执行函数(我可以看到日志),然后设备重新启动。有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

这里要问的第一个问题是 设备重启的原因。通常,普通应用程序崩溃不会导致内核级或硬件级重新启动。最有可能的是,你在崩溃处理程序完成之前就要点击监视程序计时器(在这种情况下你应该延长监视程序超时 - 不要在崩溃处理程序中重置计时器,因为那时你会冒问题的风险)在崩溃处理程序本身防止重新启动),或者这是pid 1并且它在SIGSEGV处理程序中崩溃,导致由于pid 1(init)死亡导致内核崩溃。

如果是后者,则需要更加小心在崩溃处理程序中执行的操作。记住,你刚刚崩溃了。您知道内存已损坏,但您不知道 它是如何损坏的。它可能会以影响崩溃处理程序本身的方式腐败 - 例如如果你破坏了堆元数据,那么你可能无法分配内存而不会真正崩溃。您应该将您在该处理程序中执行的操作保持在最低限度 - 特别是,避免调用未记录为async-signal-safe的任何库函数,并避免使用任何复杂(包含指针)的数据结构或动态分配的内存。为了获得最高级别的安全性,请将自己限制为fork()和exec()另一个将使用调试器API(ptrace()/proc/$PID/mem)来执行内存转储或其他任何可能需要的进程。