【问题标题】:Is there a way to step into kernel code with lldb, or otherwise, on the Mac?有没有办法在 Mac 上使用 lldb 或其他方式进入内核代码?
【发布时间】:2020-12-25 01:32:36
【问题描述】:

有没有办法在 Mac 上通过 lldb 或其他方式查看系统调用指令调用的代码?

我试图了解调用“写入”系统调用时的幕后情况。我用gcc -g编译了一个简单的.c程序:

#include <unistd.h>
#include <sys/syscall.h>
int main(void) {
  syscall(SYS_write, 1, "hello, world!\n", 14);
  return 0;
}

即使我使用以下命令,lldb 也不会进入 syscall 指令: s -a false

有什么办法吗?

【问题讨论】:

标签: macos kernel lldb xnu


【解决方案1】:

没有。如果您能够进入内核陷阱,内核将停止,调试器也将停止运行。您可以从第二个系统调试内核——如果您在 Apple 的开发人员门户下载站点上查找内核调试工具包,则有关于如何进行双机内核调试的说明。这些说明很可能针对从事内核扩展 (kext) 开发的人员,但它们会在正确的范围内为您提供帮助。

【讨论】:

    【解决方案2】:

    最好的选择(缺少两台机器)是在 VM 中运行 MacOS,然后通过串行连接内核调试器。您需要使用 boot-args(debug=0x44 或您选择的位掩码)启动 VM 内核,并从主机连接 lldb。关于如何通过网络做到这一点,有很多资源。最直接和最全面的之一是 Scott Knight 的 - https://knight.sc/debugging/2018/08/15/macos-kernel-debugging.html

    你也可以从代码中弄清楚:所有的sys调用漏斗到hndl_unix_scall64,它依次检查syscall/machtrap指标(0x2000000或0x1000000),然后定向到unix_syscall64(对于前者),然后调度到来自表的实际系统调用。在回溯中,它看起来像:

     frame #8: 0xffffff801e4ed8c3 kernel`read_nocancel + 115
     frame #9: 0xffffff801e5b62bb kernel`unix_syscall64 + 619
     frame #10: 0xffffff801df5c466 kernel`hndl_unix_scall64 + 22
    

    来源:*OS Internals, Volume II, Chapter 4 (http://NewOSXBook.com)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-28
      • 2017-05-19
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 2023-03-15
      相关资源
      最近更新 更多