在Mac上是否可以通过lldb进入内核代码?

问题描述

是否可以通过lldb或其他方式在Mac上查看syscall指令正在调用代码

我试图了解调用“ write”系统调用时发生的情况。我用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

有什么办法吗?

解决方法

不。如果您能够进入内核陷阱,则内核将被停止,调试器也将停止运行。您可以从第二个系统调试内核-如果在Apple的开发人员门户下载站点上查找内核调试工具包,则其中包含有关如何进行两机内核调试的说明。这些说明很可能是针对进行内核扩展(kext)开发的人员的,但它们将带您进入正确的舞台。

,

最好的选择(少于两台计算机)是在VM中运行MacOS,然后通过串行连接一个内核调试器。您需要使用boot-args(调试= 0x44或您选择的位掩码)启动VM内核,并从主机连接lldb。关于如何通过网络进行操作,有很多资源。最直接和最全面的方法之一是Scott Knight's-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》,第二卷,第4章(http://NewOSXBook.com