10.5 使用远程 GDB 进行联机内核调试

  从 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 窗口中自动显示源代码), 等等。

本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.