2011-11-27 127 views
1

我想在FreeBSD上调试多进程解决方案。当系统/设备遇到类似情况的挂起时,我们通过'sysctl debug.panic = 1'强制内核转储。意图是在相同的时间点捕获所有进程的状态。但是,我是 无法查看用户空间应用程序的线程堆栈。使用'ps',我能够 列出所有用户空间进程/线程,但无法设置其堆栈帧并使用'bt'展开。从FreeBSD的内核核心转储中提取用户空间线程堆栈

是否有可能实现类似于我正在尝试执行的操作?我已经看到OpenVMS 调试器(IIRC甚至windbg)允许一个人窥探到用户空间线程。

回答

1

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

+0

谢谢,让我通读它 – hackworks

1

在DDB“BT/U”将跟踪线程的堆栈的用户空间部分。见“人4 DDB”,即,与textdump结合可能是不够的。

如果你有工作是核心,事情变得更加复杂

在kgdb中,“info threads”会列出内核崩溃时正在运行的所有线程,然后“thread X”后跟“bt”会给你in-kernel部分线程堆栈

获取应用程序的userland部分将会更困难。最简单的方法可能是修改gcore应用程序,以便我t使用libkvm挖掘与给定进程关联的虚拟机结构,并基本上重建进程的核心转储。这是可能的,但我认为目前还没有现成的解决方案。

+0

他们已经删除了设备上的ddb,它可以变得更难...让我先找到一个工作ddb,看看我能走多远。我在linux上使用交叉编译的gdb – hackworks

+0

对于调试FreeBSD内核核心,常规GDB可能并不是那么有用。首先,并非所有内核核心格式都是“标准”的。例如,FreeBSD的KGDB与libkvm链接,它知道如何处理小型转储(这是目前的默认值)。至少你需要使用'sysctl debug.minidump = 0'禁用小转储,以便生成的核心处于正常的ELF格式。即便如此,核心将有*物理*内存转储,GDB将需要libkvm以将内核虚拟地址转换为物理地址。 – ArtemB