[LLDB]debug XNU Kernel环境搭建

2,449 阅读6分钟

准备文件

系统镜像

使用gibMacOS下载MacOS镜像。2021年2月推荐下载10.15.6 Beta (19G60d)。因为这个版本有对应的KDK和源码。 下载好对应的软件包后双击gibMacOS.command后等待出现选择菜单选择C切换渠道到customer就能找到10.15.6 Beta (19G60d) 然后输入8开始下载10.15.6 Beta (19G60d)。 下载完成后双击gibMacOS下的BuildmacOSInstallApp.command将下载好的文件转成macos的应用。 运行完毕后会得到一个Install macOS Catalina Beta应用

KDK

到此网站 developer.apple.com/download/mo… 下载对应的kernel debug kit

源码

到此网站 opensource.apple.com/release/mac… 下载想要调试的源码 如 xnu-6153.141.1IONetworkingFamily-139.140.2

安装环境

安装到本机

利用mac系统自带的磁盘工具添加一个卷宗。如图 然后双击Install macOS Catalina Beta将该系统安装到本机上。注意安装的磁盘选择我们刚刚创建的10.15.6。不然可会格式化本机系统。 安装成功后通过 系统偏好设置-启动磁盘启动到10.15.6的系统上

安装到虚拟机

使用vmware可以直接选择对应Install macOS Catalina Beta.app作为安装映像。步骤和安装到本机类似。 可以在安装前使用terminal将SIP关掉。方便后续安装KDK

csrutil disable

安装KDK

将之前准备好的KDK同时安装到本机和虚拟机 并在本机的home目录下创建一个.lldbinit-lldb文件用来加载xnu内核中的lldb宏

echo "settings set target.load-script-from-symbol-file true" > ~/.lldbinit-lldb

安装并开启development内核

进入到虚拟机copy development内核到/S/L/E(确保已经关闭SIP。使用csrutil status来确认)

sudo cp /Library/Developer/KDKs/*/System/Library/Kernels/kernel.development /System/Library/Kernels/

遇到权限问题可以通过下面的代码赋予读写权限

sudo mount -uw /
sudo chown :admin /System/Library/Extensions/
sudo chmod 775 /System/Library/Extensions/

将内核copy到/S/L/E后设置nvram启动参数然后清理缓存并重启

sudo nvram boot-args="pmuflags=1 debug=0x167 kext-dev-mode=1 kcsuffix=development -v"
sudo kextcache -invalidate /
sudo reboot

至此虚拟机的准备工作已经完成

远程调试内核

上面步骤完成后虚拟机在启动时停止在一处,等待调试器挂载。 可以提前将xnu源码解压到对应路径方便源码调试如:

sudo mount -uw /
sudo mkdir -p /AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/xnu/xnu-6153.141.1
sudo cd /AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/xnu/xnu-6153.141.1
sudo unzip /path/to/xnu-6153.141.1.tar.gz

设置lldb默认的python版本为2 用完再记得再切会 3 defaults write com.apple.dt.lldb DefaultPythonVersion 3

defaults write com.apple.dt.lldb DefaultPythonVersion 2

使用lldb启动待调试内核

lldb /Library/Developer/KDKs/*/System/Library/Kernels/kernel.development

进入到lldb控制台后输入kdp-remote和虚拟机的ip来连接两台机器。

kdp-remote <虚拟机的ip>

虚拟机的ip可以在虚拟机的启动页面尾部找到如:

ip address: (虚拟机的ip)
 
Waiting for remote debugger connection.

没问题的话可以到此就可以调试内核了。

利用vscode来调试

1.安装codelldb扩展 2.设置配置文件(配置文件的保存可能需要sudo权限)

{
    "type": "lldb",
    "request": "custom",
    "name": "Custom launch",
    "targetCreateCommands": [
        "settings set target.load-script-from-symbol-file true",
        "target create /Library/Developer/KDKs/KDK_10.15.6_19G60d.kdk/System/Library/Kernels/kernel.development"
    ],
    "processCreateCommands": [
        "kdp-remote 虚拟机的ip",
    ]
}

然后启动即可通过vscode来源码调试内核

其他

因为apple提供的KDK版本有限,调试起来也存在一些限制。 偶然发现一篇文章基于virtualbox的调试内核和工具主要是支持DSYM复用。任意时刻断点。 具体可以参考 blog.quarkslab.com/lldbagility…

关于App-Infra DevOps 团队

App-Infra DevOps团队作为公司的移动研发中台,致力于优化公司各业务的研发和交付过程中的质量、成本、安全、效率和体验。到目前为止我们已经有超过上百个业务接入,1万+人日常使用;平均每天支撑 3000+研发任务顺利交付;建设了业界领先且可能是国内最大的构建集群,每天运行20万+次构建任务。

我们期待更多有热情和创造力的同学加入字节跳动,为字节打造业界最领先,最高效的生产工具。

我们的工作内容主要包括:

  • 提供任务管理,工程管理,开发调试,交付流程支持的一站式同开发平台。同时提供Native版及Web版,目标成为下一代端云协同的研发基础设施。
  • 客户端 IDE 云化的探索性项目,目的是提供一整套线上编码、调试环境,让用户打开浏览器就可以进行代码开发,满足不同场景的需要,提升研发效率。

加入我们

北京-高级iOS开发工程师 — 终端技术 job.toutiao.com/s/2YHxkXW

职位描述

1、负责公司产品的通用技术研发和性能优化,完成高质量编码和测试工作 2、框架维护,通用工具开发等 3、设计良好的代码结构,不断迭代重构; 4、前沿技术研究,承担重点、难点的技术攻坚

职位要求

1、本科及以上学历,计算机、通信等相关专业 2、具有扎实的编程功底,良好的设计能力和编程习惯 3、熟练掌握Objective-C,C++,熟悉Swift的优先 4、熟悉bash/python/ruby/js的优先

上海-高级iOS开发工程师 — 基础技术 job.toutiao.com/s/2YHm8a7

职位描述

  1. 负责公司客户端产品的通用基础技术研发,完成高质量编码和测试工作
  2. 通用研发工具开发、通用框架开发等
  3. 设计良好的代码结构,不断迭代重构
  4. 前沿技术研究,承担重点、难点的技术攻坚

职位要求

  1. 本科及以上学历,计算机、通信等相关专业
  2. 具有扎实的编程功底,良好的设计能力和编程习惯
  3. 熟练掌握Objective-C,C++,熟悉Swift的优先
  4. 熟悉前后端相关和跨平台技术、熟悉bash/python/ruby/js等语言和相关框架的优先

杭州-高级iOS开发工程师 — 基础技术 job.toutiao.com/s/2YHdPAE

职位描述

  1. 负责公司跨平台相关技术研发,完成高质量编码和测试工作
  2. 负责通用跨端框架及周边工具开发等
  3. 设计良好的代码结构,不断迭代重构
  4. 前沿技术研究,承担重点、难点的技术攻坚

职位要求

  1. 本科及以上学历,计算机、通信等相关专业
  2. 具有扎实的编程功底,良好的设计能力和编程习惯
  3. 熟练掌握Objective-C,C++,熟悉Swift的优先
  4. 熟悉前后端相关和跨平台技术,熟悉bash/python/ruby/js等语言和相关框架的优先