2

我想知道当手机(android)意外重启时谁叫*sys_reboot*。

有没有办法在系统调用(android内核)中转储调用堆栈?

4

1 回答 1

1

如果您只想要内核调用跟踪,您可以通过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以获取对同一问题的另一个参考。

于 2012-10-09T10:24:59.953 回答