gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:34 26 4
gpt4 key购买 nike

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

最佳答案

这里要问的第一个问题是为什么设备重启。通常,普通应用程序崩溃不会导致内核级或硬件级重启。最有可能的是,您要么在崩溃处理程序完成之前就触发了看门狗定时器(在这种情况下,您应该延长看门狗超时时间——尽管如此,但不要从崩溃处理程序中重置定时器,否则您将面临崩溃处理程序中出现问题的风险本身阻止重新启动),或者这是 pid 1 并且它在 SIGSEGV 处理程序中崩溃,由于 pid 1(init)死亡导致内核 panic 。

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

关于linux - 信号处理程序 (segv) 无法在设备崩溃前完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31912919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com