0

我想知道在调试远程内核时是否确实有办法在 gdb 和 ddb 之间切换。

我已经在 gdb(或者更确切地说是 kgdb)提示符下。从这里如何切换到被调试机器上的本地 ddb?

我的内核配置文件已经包含options BREAK_TO_DEBUGGER,并且我同时配置了 GDB 和 DDB:

options GDB
options DDB

根据开发人员手册,“每次键入 gdb 时,都会在远程 GDB 和本地 DDB 之间切换模式。为了立即强制执行下一个陷阱,只需键入 s(步骤)。您的托管 GDB 现在将获得对目标内核:”

所以,我确实尝试在 gdb 提示符下输入“gdb”(有趣的是:D),正如预期的那样,这是一个无法识别的命令。显然,这个命令应该在 ddb 提示符下输入。但我的问题是,如何从正在运行的机器中掉线到 ddb,其串行端口(尽管是虚拟的)远程连接到另一台机器的 KGDB?当远程 GDB 正在侦听并且我使用 强制恐慌sysctl debug.kdb.enter=1时,它确实会进入远程 KGDB。但是,当它不听时,系统就会冻结。

我想要的是在本地机器上输入 ddb 。使用它进行一些调试;对于最好使用 KGDB 完成的事情,请转到远程 KGDB,然后在我完成后切换回本地 DDB。

有没有办法做到这一点?

4

1 回答 1

0

KDB 包含 DDB 和 KDB 后端,但它们可用时有很多条件。要检查后端是否可用,请检查 sysctl debug.kdb.available 和 debug.kdb.current (sys/kern/subr_kdb.c)。如果两个后端都可用,debug.kdb.available 应该包含“ddb gdb”。

在后端(gdb / ddb)之间切换的可能方法是首先进入ddb,然后调用gdb并进行调试。然后退出gdb,返回ddb(实际上会出现新的trap,好像需要Ctrl+C)。这意味着在恐慌之前,debug.kdb.current 应该设置为“ddb”。

我希望它会有所帮助。

于 2016-04-21T07:11:54.210 回答