通过以太网在Mac之间进行双机GDB调试-事务超时
我正在尝试调试一个设备驱动程序,该驱动程序正在使用运行gdb的远程机器(尝试按照说明)在Mac上崩溃内核。两台机器都通过以太网连接到同一个网络(甚至是同一个路由器,并且都可以访问网络)。我还设置了目标上的nvram引导args=“debug=0x144”,并重新启动 然后像往常一样在目标上加载内核扩展。在主机上,我按如下方式启动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 -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),在引导时停止
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脚本
以上所有内容均记录在中