【问题标题】:Toggling between remote KGDB and local DDB within a debugging session在调试会话中在远程 KGDB 和本地 DDB 之间切换
【发布时间】:2016-08-11 02:51:03
【问题描述】:

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

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

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

options GDB
options DDB

根据developer's handbook,“每次键入 gdb,模式将在远程 GDB 和本地 DDB 之间切换。为了立即强制执行下一个陷阱,只需键入 s(步骤)。您的托管 GDB 现在将获得对目标内核的控制权:"

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

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

有没有办法做到这一点?

【问题讨论】:

    标签: debugging remote-debugging freebsd kgdb


    【解决方案1】:

    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”。

    我希望它会有所帮助。

    【讨论】:

    • sysctl debug.kdb.availableddb gdb sysctl debug.kdb.currentgdb 我已经在ddb提示符(当gdb处于活动状态时)尝试ctrl-c将控制权返回给GDB,但无济于事。如果我玩debug.kdb.current,我能实现我的目标吗?
    • 不确定。应该及时有1个后端。从DDB过渡到GDB是“gdb”命令,过渡回来是终止gdb。
    • 我用sysctl debug.kdb.current=ddb将当前后端更改为ddb。然后我触发了恐慌,我在 ddb 提示符下。在此处键入 gdb 会将机器连接到客户端机器上的 gdb 后端。然而,在那里退出 gdb 让我回到调试机器上的 shell 提示符,而不是 ddb。应该是这样吗?
    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多