内核调试两台物理 MacBook pro 设备
Kernel debug two physical MacBook pro devices
我正在尝试对物理 Macbook pro 设备进行内核调试。
当我的设置包含一个虚拟机时,在主机 MacOS 和来宾 MacOS 之间,使用 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 到以太网适配器)--> 以太网电缆 <--(ThunderBolt 到以太网适配器)<--(ThunderBolt3 到 ThunderBolt2 适配器)<-- MacOS-debuggee
一般来说,我使用以下教程进行调试,该教程适用于 VM 调试:
https://knight.sc/debugging/2018/08/15/macos-kernel-debugging.html,我没有找到确切的KDK版本,不过我觉得应该不是这里的问题
我的调试器是BigSur
,我的调试器是Catalina
任何关于问题可能的想法都会有所帮助
您的硬件设置听起来不错。请注意,您不一定需要直接以太网电缆连接,您可以使用普通的 office-/home-wide 有线网络,在调试器和目标之间有一个开关(甚至多个)就可以了。调试器机器甚至可以使用 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
设置后尝试调试会话之前干净地重新启动机器。
更多评论:
kext-dev-mode=1
这个选项不再有任何作用。它只存在于 OS X 10.10。你可以删除它。
I didn't find the exact KDK version, but I don't think it should be the problem here
拥有与目标的确切内核二进制 UUID 不匹配的 KDK 版本不会阻止连接,但它会阻止您进行任何有意义的内存布局调试线程等将不可用。
My debugger is Big Sur, and my debuggee is Catalina
如果你曾经 运行 Big Sur 在你的目标上,请确保将 wdt=-1
添加到你的 boot-args
否则 hung/crashed 机器会在你有机会之前重新启动连接调试器。
我正在尝试对物理 Macbook pro 设备进行内核调试。
当我的设置包含一个虚拟机时,在主机 MacOS 和来宾 MacOS 之间,使用 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 到以太网适配器)--> 以太网电缆 <--(ThunderBolt 到以太网适配器)<--(ThunderBolt3 到 ThunderBolt2 适配器)<-- MacOS-debuggee
一般来说,我使用以下教程进行调试,该教程适用于 VM 调试: https://knight.sc/debugging/2018/08/15/macos-kernel-debugging.html,我没有找到确切的KDK版本,不过我觉得应该不是这里的问题
我的调试器是BigSur
,我的调试器是Catalina
任何关于问题可能的想法都会有所帮助
您的硬件设置听起来不错。请注意,您不一定需要直接以太网电缆连接,您可以使用普通的 office-/home-wide 有线网络,在调试器和目标之间有一个开关(甚至多个)就可以了。调试器机器甚至可以使用 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
设置后尝试调试会话之前干净地重新启动机器。
更多评论:
kext-dev-mode=1
这个选项不再有任何作用。它只存在于 OS X 10.10。你可以删除它。
I didn't find the exact KDK version, but I don't think it should be the problem here
拥有与目标的确切内核二进制 UUID 不匹配的 KDK 版本不会阻止连接,但它会阻止您进行任何有意义的内存布局调试线程等将不可用。
My debugger is Big Sur, and my debuggee is Catalina
如果你曾经 运行 Big Sur 在你的目标上,请确保将 wdt=-1
添加到你的 boot-args
否则 hung/crashed 机器会在你有机会之前重新启动连接调试器。