通过以太网在Mac之间进行双机GDB调试-事务超时

通过以太网在Mac之间进行双机GDB调试-事务超时,gdb,driver,kernel-extension,Gdb,Driver,Kernel Extension,我正在尝试调试一个设备驱动程序,该驱动程序正在使用运行gdb的远程机器(尝试按照说明)在Mac上崩溃内核。两台机器都通过以太网连接到同一个网络(甚至是同一个路由器,并且都可以访问网络)。我还设置了目标上的nvram引导args=“debug=0x144”,并重新启动 然后像往常一样在目标上加载内核扩展。在主机上,我按如下方式启动gdb: $ gdb -arch i386 /Volumes/KernelDebugKit/mach_kernel 进入gdb后,我加载内核宏并设置远程连接 (gdb)

我正在尝试调试一个设备驱动程序,该驱动程序正在使用运行gdb的远程机器(尝试按照说明)在Mac上崩溃内核。两台机器都通过以太网连接到同一个网络(甚至是同一个路由器,并且都可以访问网络)。我还设置了目标上的nvram引导args=“debug=0x144”,并重新启动

然后像往常一样在目标上加载内核扩展。在主机上,我按如下方式启动gdb:

$ gdb -arch i386 /Volumes/KernelDebugKit/mach_kernel
进入gdb后,我加载内核宏并设置远程连接

(gdb) source /Volumes/KernelDebugKit/kgmacros
(gdb) target remote-kdp
(gdb) kdp-reattach 11.22.33.44
然而,最后一个命令没有建立连接,我得到了一个无休止的卷轴

kdp_reply_wait: error from kdp_receive: receive timeout exceeded
kdp_transaction (remote_connect): transaction timed out
kdp_transaction (remote_connect): re-sending transaction

将gdb连接到目标机器的正确方法是什么?

答案是,在您尝试从主机连接gdb之前,确保目标有一个内核死机。

有许多方法可以侵入目标,包括:

  • 内核恐慌,如您在上面的回答中所述
  • 不可屏蔽中断,由cmd选项ctrl shift esc组合键触发
  • 使用pexpert/pexpert.h中声明的PE_enter_debugger()在内核扩展中编写中断代码
  • 通过在NVRAM引导参数值中设置DB_Halt(0x01),在引导时停止
此外,您可能需要设置一个持久的ARP表条目,因为目标在调试器中停止时无法响应ARP请求。如果ARP条目不存在,我将在调试器启动shell脚本中使用以下命令设置它:

if !(arp -a -n -i en0 | grep '10\.211\.55\.10[)] at 0:1c:42:d7:29:47 on en0 permanent' > /dev/null) ; then
    echo "Adding arp entry"
    sudo arp -s 10.211.55.10 00:1c:42:d7:29:47
fi
如果有更专业的人可能会改进我的shell脚本

以上所有内容均记录在中