内核调试两个物理 MacBook Pro 设备

Posted

技术标签:

【中文标题】内核调试两个物理 MacBook Pro 设备【英文标题】:Kernel debug two physical MacBook pro devices 【发布时间】:2021-07-31 00:05:06 【问题描述】:

我正在尝试对物理 Macbook pro 设备进行内核调试。 当我的设置在主机 MacOS 和来宾 MacOS 之间包含一个 VM 时,使用 lldb -o "kdp-remote <guest_machine_ip>" 可以正常工作

我的远程(调试)Macbook 上的引导参数是:

user$ nvram boot-args
boot-args       debug=0x44 kext-dev-mode=1 pmuflags=1 -v kcsuffix=debug

当我使用任一触发内核调试时 sudo dtrace -w -n "BEGIN breakpoint(); "LEFT CMD + RIGHT CMD + PowerButton,系统处于暂停模式,不响应任何东西(鼠标不动等) 但是当我尝试使用前面提供的 lldb 命令从主机连接到机器时,它不起作用。 我已经确保机器可以互相 ping 通,并且可以建立 SSH 连接。

据我所知,我必须使用特殊的 Apple 适配器 (Real™ Ethernet adapter),因此我使用以下适配器来调试远程机器:

https://www.apple.com/shop/product/MMEL2AM/A/thunderbolt-3-usb-c-to-thunderbolt-2-adapter https://www.apple.com/shop/product/MD463LL/A/thunderbolt-to-gigabit-ethernet-adapter

物理连接设置如下所示:

MacOS-Debugger --(USBC to Ethernet adapter)--> Ethernet cable

我通常使用以下教程进行调试,该教程适用于 VM 调试: https://knight.sc/debugging/2018/08/15/macos-kernel-debugging.html,我没有找到确切的KDK版本,但我认为应该不是这里的问题

我的调试器是BigSur,我的被调试者是Catalina

任何关于问题可能的想法都会有所帮助

【问题讨论】:

【参考方案1】:

您的硬件设置听起来不错。请注意,您不一定需要直接的以太网电缆连接,您可以使用普通的办公室/家庭有线网络,在调试器和目标之间有一个(甚至多个)开关是可以的。调试器机器甚至可以使用 wifi,只要它可以通过这种方式到达目标的有线网络连接,尽管不建议这样做。 Thunderbolt 以太网接口不需要是 Apple 品牌,但它的驱动程序确实需要包含内核调试支持。例如,在实践中,我也成功地在 OWC 品牌的 Thunderbolt Dock 中使用了以太网端口。使用 Apple 自己的适配器之一当然可以保证它可以正常工作。

如果您的目标机器上的boot-args 与您在VM 中使用的相同,那可能就是您的问题所在。您应该使用kdp_match_name= 选项指定要用于内核调试的设备。使用终端中的ifconfig 命令确定列出的设备中的哪一个是您的 Thunderbolt 以太网适配器 (enX),可能基于 IP 地址。 en0 通常是 Mac 笔记本电脑中的 wifi,因此您通常会寻找 X > 0。

因此,您最终会在您的 boot-args 中添加类似 kdp_match_name=en1 的内容。在更新 boot-args 设置后,请确保在尝试调试会话之前干净地重新启动计算机。

还有几个cmets:

kext-dev-mode=1

此选项不再有效。它只存在于 OS X 10.10 中。你可以删除它。

我没有找到确切的 KDK 版本,但我认为这应该不是这里的问题

拥有与目标的确切内核二进制 UUID 不匹配的 KDK 版本不会阻止连接,但它阻止您进行任何有意义的调试,因为线程的内存布局等会不可用。

我的调试器是 Big Sur,我的调试器是 Catalina

如果您曾经在目标上运行过 Big Sur,请务必将 wdt=-1 添加到您的 boot-args 中,否则挂起/崩溃的机器将在您有机会连接调试器之前重新启动。

【讨论】:

完美!谢谢顺便说一句,我尝试将这种方法用于 wifi 连接(en0),它不起作用,它只适用于我上面描述的物理接口 @0xAK 你不能在目标机器上使用 wifi,只能在运行 lldb 的机器上使用。即使在那里,我也不推荐它,因为该协议在存在丢包或延迟的情况下表现很差,而 Wifi 往往会在某种程度上受到影响。

以上是关于内核调试两个物理 MacBook Pro 设备的主要内容,如果未能解决你的问题,请参考以下文章

Kernel 内核调试

Linux 内核 内存管理内存映射原理 ① ( 物理地址空间 | 外围设备寄存器 | 外围设备寄存器的物理地址 映射到 虚拟地址空间 )

在 Mac 上每隔一次部署开始调试内核时出现致命错误

[架构之路-29]:目标系统 - 系统软件 - Linux OS内核以及内核驱动的调试技术

在设备管理器里看cpu我这不是显示12内核吗??不过我在任务管理器里写着6个内核

Android内核的编译和调试