首页 > 解决方案 > 有没有办法在 Mac 上使用 lldb 或其他方式进入内核代码?

问题描述

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

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

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

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

有什么办法吗?

标签: macoskernellldbxnu

解决方案


您最好的选择(缺少两台机器)是在 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(对于前者),然后调度到实际的 sys 调用从表。在回溯中,它看起来像:

 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 )


推荐阅读