10.5 使用远程 GDB 进行联机内核调试
优质
小牛编辑
135浏览
2023-12-01
从 FreeBSD 2.2 开始提供了对这一功能的支持, 实际上, 它也是一种非常灵活的方式。
GDB 很久以前就已经支持 远程调试 了。 这是通过一种非常简单的串口线协议来实现的。 与前面介绍的方法不同, 要使用这种方式, 您需要使用两台计算机。 其中一台用于提供调试环境, 其中包括全部源代码, 以及一份包含全部符号的编译好的内核; 另一台则运行这一内核 (已经脱去了调试信息)。
您应使用 config -g 来配置内核, 并在配置中加入 DDB
, 并按通常的方法编译。 由于包含了调试信息, 这样做得到的编译结果会很大。 将这个内核复制到目标机上, 并使用 strip -x 脱去调试符号, 并使用引导选项 -d
来启动。 用于连接调试主机的目标机上, 应为调试串口设备设置 "flags 080"。 现在, 在调试机上, 进入目标内核的编译目录, 并启动 gdb:
% kgdb kernel GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.16 (i386-unknown-freebsd), Copyright 1996 Free Software Foundation, Inc... (kgdb)
用下面的命令初始化远程调试会话 (如果使用的是第一个串口的话):
(kgdb) target remote /dev/cuaa0
现在, 在目标机 (在开始设备检测之前就进入了 DDB), 输入:
Debugger("Boot flags requested debugger") Stopped at Debugger+0x35: movb $0, edata+0x51bc db> gdb
DDB 将给出响应:
Next trap will enter GDB remote protocol mode
每次输入 gdb 时, 都会在远程 GDB 与本地 DDB 模式之间切换。 要立即触发一个 trap, 可以简单地输入 s (step)。 您的 GDB 将获得目的内核的控制权:
Remote debugging using /dev/cuaa0 Debugger (msg=0xf01b0383 "Boot flags requested debugger") at ../../i386/i386/db_interface.c:257 (kgdb)
您可以像使用任何其他 GDB 会话一样进行调试, 包括访问完整的内核, 在 Emacs 窗口中以 gud-模式 来执行 (这会在另一 Emacs 窗口中自动显示源代码), 等等。