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

时间:2011-11-27 12:10:38

标签: gdb freebsd coredump

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

如果您需要处理的只是核心,那么事情会变得复杂一些。

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

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

相关问题