Gdb 从FreeBSD上的内核内核转储中提取用户空间线程堆栈

Gdb 从FreeBSD上的内核内核转储中提取用户空间线程堆栈,gdb,freebsd,coredump,Gdb,Freebsd,Coredump,我正在尝试调试FreeBSD上的多进程解决方案。当系统/设备遇到类似挂起的场景时,我们通过'sysctl debug.panic=1'强制内核转储。这个 目的是在同一时间点捕获所有进程的状态。然而,我是 无法查看用户空间应用程序的线程堆栈。使用“ps”,我能够 列出所有用户空间进程/线程,但无法设置其堆栈帧并使用“bt”展开 有没有可能达到我想要达到的目标?我见过OpenVMS 调试器(IIRC甚至windbg),允许查看用户空间线程。使用DDB。它支持跟踪线程。看见同一篇文章还命名了用于跟踪用

我正在尝试调试FreeBSD上的多进程解决方案。当系统/设备遇到类似挂起的场景时,我们通过'sysctl debug.panic=1'强制内核转储。这个 目的是在同一时间点捕获所有进程的状态。然而,我是 无法查看用户空间应用程序的线程堆栈。使用“ps”,我能够 列出所有用户空间进程/线程,但无法设置其堆栈帧并使用“bt”展开

有没有可能达到我想要达到的目标?我见过OpenVMS
调试器(IIRC甚至windbg),允许查看用户空间线程。

使用DDB。它支持跟踪线程。看见同一篇文章还命名了用于跟踪用户空间线程的
kgdb
命令。但在手册页中找不到:-(

在DDB中,“bt/u”将跟踪线程堆栈的用户区部分。请参阅“man 4 DDB”。这与textdump结合起来就足够了

如果你只需要使用核心,事情会变得更复杂

在kgdb中,“info threads”将列出内核崩溃时运行的所有线程。之后,“thread X”后跟“bt”将给出线程堆栈的内核部分


获取应用程序的userland部分将更加困难。最简单的方法可能是修改gcore应用程序,以便它使用libkvm挖掘与给定进程相关的VM结构,并从本质上重建进程的coredump。这是可能的,但我认为目前还没有现成的解决方案。

我在Linux上使用交叉编译的gdb。常规gdb可能对调试FreeBSD内核没有多大用处。首先,并非所有内核核心格式都是“标准”格式。FreeBSD的KGDB与libkvm链接,libkvm知道如何处理minid例如,umps(这是目前的默认设置)。至少您需要使用“sysctl debug.minidump=0”禁用迷你转储,以便生成的内核采用某种正常的ELF格式。即使如此,内核仍将转储物理内存,GDB将需要libkvm,以便将内核虚拟地址转换为物理地址。