【问题标题】:how to dump call stack in syscall(android kernel) ?如何在 syscall(android kernel) 中转储调用堆栈?
【发布时间】:2023-04-02 03:20:01
【问题描述】:

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

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

【问题讨论】:

  • 请注意,来自syscall 的内核调用堆栈将只有一层深......因为它是进入内核的第一种方式。您确定此时需要 kernel 调用堆栈,还是 userland 调用堆栈?
  • 不,我真正想要的是用户空间堆栈。所以我不认为 'dump_stack()' 或 'panic()' 可以工作
  • 你需要停止进程/线程send_sig_info(SIGSTOP, SEND_SIG_FORCED, current),然后生成一个用户空间助手gdbpstack脚本,或busybox-内置)获取堆栈跟踪,然后继续该过程。

标签: android kernel system-calls


【解决方案1】:

如果你想要一个内核调用跟踪,你可以通过dump_stack()得到它。 panic() 称其为除其他外。 BUG() / BUG_ON() wrappers 给它一个更具描述性的消息和一个可选的条件测试。

userland stacktrace,特别是一个符号的,但是,不能直接从内核中可靠地获得。可以将堆栈内存复制到内核空间并记录内容,或者如果没有优化帧指针,甚至可以启发式遍历SP/FP 链接,但是要解析符号,它需要访问和解析 ELF 信息.我不确定是否有人将其作为纯内核端实现。一个更简单的解决方案是从您的系统调用挂钩中停止程序,生成一个附加到它的用户空间调试器,提取堆栈跟踪,完成后继续程序。

请参阅此 SO 帖子,call_usermodehelper / call_usermodehelperpipe usage 了解如何执行此操作。

另请参阅此 SO 帖子:How to print the userspace stack trace in linux kernelspace 以获取对同一问题的另一个参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2016-03-05
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多