这是Francesco Cagnin有关macOS内核调试的第二篇文章。在上一篇文章中,作者定义了本篇文章中使用的大多数术语,描述了如何为macOS内核实施内核调试,并讨论了可用工具的局限性。本篇文章中,我们就介绍LLDBagility,这是上文中为macOS内核实施内核调试的解决方案,可提供更轻松,更实用的macOS调试体验。
在当前情况下,调试macOS内核(XNU)不太实用,尤其是考虑到诸如必须安装调试内核构建以及无法设置监测点或暂停执行的内核调试器的不便之处。为了改善这种情况,作者开发了LLDBagility ,这是一种借助快速调试协议(FDP,在本文后面进行介绍)调试macOS虚拟机的工具。最重要的是,LLDBagility实现了一组新的LLDB命令,这些命令允许调试器执行以下操作:
1.连接到运行中的macOS VirtualBox虚拟机并秘密地调试其内核,奇热而无需更改客户操作系统(例如,无需开发或调试内核, boot-args修改或禁用SIP),并且只需对虚拟机的配置进行最小的更改;
2.随时中断(然后恢复)客户内核的执行;
3.即使在启动过程开始时,也可以在内核代码中的任何位置设置硬件断点;
4.设置在指定存储位置的读取或写入访问时触发的硬件观察点;
5.保存并在几秒钟内恢复虚拟机的状态。
这些命令旨在与LLDB中已经可用的命令一起使用,例如内存/寄存器读/写、断点(软件),步骤等。此外,如果调试后的内核附带了其内核调试工具包(甚至可能没有,后面会讨论),那么绝大多数lldbmacros都可以正常工作。
下面,我们首先简要介绍什么是FDP,以及它如何增强VirtualBox来实现虚拟机自省。然后,我们研究LLDBagility如何利用这些新功能透明地将LLDB连接到macOS虚拟机,并演示一个简单的内核调试会话。最后,我们提出了一些在缺乏调试工具包的内核构建中使用现有lldbmacros的想法。
通过快速调试协议对虚拟机进行自省
快速调试协议是一个轻量级、快速和高效的调试API,用于虚拟机的自省性检查,使用C语言编写,目前仅作为VirtualBox源代码[