我想知道当手机(android)意外重启时谁叫*sys_reboot*。
有没有办法在系统调用(android内核)中转储调用堆栈?
如果您只想要内核调用跟踪,您可以通过dump_stack()
. panic()
所谓的,除其他外。BUG()
/BUG_ON()
包装器给它一个更具描述性的消息和一个可选的条件测试。
但是,用户级堆栈跟踪,尤其是符号堆栈跟踪,不能直接从内核中可靠地获得。可以将堆栈内存复制到内核空间并记录内容,或者如果没有优化帧指针,甚至可以启发式遍历SP
/FP
链接,但是要解析符号,它需要访问和解析 ELF 信息。我不确定是否有人将其作为纯内核端实现。一个更简单的解决方案是从您的系统调用挂钩中停止程序,生成一个附加到它的用户空间调试器,提取堆栈跟踪,完成后继续程序。
有关如何执行此操作的信息,请参阅此 SO 帖子call_usermodehelper / call_usermodehelperpipe 用法。
另请参阅此 SO 帖子:How to print the userspace stack trace in linux kernelspace以获取对同一问题的另一个参考。