【问题标题】:Extracting userspace thread stack from kernel core dump on FreeBSD从 FreeBSD 上的内核核心转储中提取用户空间线程堆栈
【发布时间】:2012-03-28 14:56:56
【问题描述】:

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

是否有可能实现我正在尝试执行的操作?我见过 OpenVMS 调试器(IIRC 甚至是 windbg)允许查看用户空间线程。

【问题讨论】:

    标签: gdb freebsd coredump


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      在 DDB 中,“bt/u”将跟踪线程堆栈的用户态部分。参见“人 4 ddb”。那,结合 textdump 可能就足够了。

      如果你只需要处理核心,事情就会变得有点复杂。

      在 kgdb 中,“信息线程”将列出内核崩溃时正在运行的所有线程。之后,“线程 X”后跟“bt”将为您提供线程堆栈的内核部分。

      获取应用程序的用户空间部分会更难。最简单的方法可能是修改 gcore 应用程序,以便它使用 libkvm 挖掘与给定进程关联的 VM 结构并从本质上重建进程的核心转储。有可能,但我认为目前没有现成的解决方案。

      【讨论】:

      • 他们已经删除了设备上的 ddb,它会变得更难吗...让我先找到一个工作的 ddb,看看我能走多远。我在 linux 上使用交叉编译的 gdb
      • 常规 GDB 对于调试 FreeBSD 内核内核可能不是那么有用。首先,并非所有内核核心格式都是“标准的”。例如,FreeBSD 的 KGDB 与 libkvm 链接,后者知道如何处理 minidumps(这是目前的默认设置)。至少您需要使用 'sysctl debug.minidump=0' 禁用小型转储,以便生成的内核具有某种正常的 ELF 格式。即使这样,内核也会转储物理内存,GDB 需要 libkvm 才能将内核虚拟地址转换为物理地址。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2015-03-28
      • 1970-01-01
      相关资源
      最近更新 更多