首批通过分布式安全可靠测评,为关键业务系统打造
obstack 常见问题的解法
更新时间:2026-06-08 02:41
obstack 用于实时抓取进程/线程的调用栈,这一点与 pstack 是一致的,而且 obstack 对进程的影响极小,是无损诊断,因此对生产环境的诊断意义重大。
基本功能
抓取进程所有线程的调用栈
obstack $pid
抓取某个线程的调用栈
obstack $tid -t
堆栈聚合
-a 参数用于将相同堆栈的线程聚合,便于共性调用链的展示。
忽略行号
如果目标进程二进制包含 debuginfo,obstack 在结果中会输出代码的位置信息,该操作效率较低,-o 参数用于关闭之,获得更高的执行效率。
小功能不少,强烈建议只用 obstack $pid > ps。
常见问题
结果只有函数名,没有代码位置信息怎么办?

首先确认自己是否真的需要行号,大多数情况其实是不需要的,少数情况开发人员可能需要,如果确实需要,继续往下走。
先确认二进制是否包含了
debuginfo。readelf -S bin/observer | grep debug_info没有输出,则需要下载或安装相应版本的
debuginfo,找到observer.debug文件。obstack $pid -d$debug_path其中 $debug_path 为 observer.debug 文件的全路径,-d 后面不要接空格。
备注
哪些环境会出现这种现象?
生产环境中不加额外的参数,那么默认是无代码位置信息,加了参数指定 debug 路径会有代码信息。
结果没有函数符号,全是 ??? 怎么办?

先确认二进制是否包含了符号表。
readelf -S bin/observer | grep symtab没有输出,则需要下载或安装相应版本的
debuginfo,找到observer.debug文件。obstack $pid -s$debug_path -d$debug_path其中
$debug_path为observer.debug文件的全路径,-s后面不要接空格,-d后面不要接空格。
备注
哪些环境会出现这种现象?
从 V3.x 某个版本开始 OBServer 正式包的二进制自带符号表,不再放入 `debug` 包内,所以仅存量早期版本存在这种问题。
ARM 环境线程的堆栈层数很少,不正常怎么办?

出现这种情况,如果一定要得到堆栈,那么没有其他办法,只能靠 pstack 或者 gdb。
如果环境接受一段时间的进程 hang 死(通常在分钟级),那么可以使用 pstack,使用
pstack $pid > ps。如果不能接受。需要权衡,如果可以接受某个线程 hang 死或者已经明确知道线程已经 hang 死,那么可以用
gdb来取堆栈,假设要抓的线程 id 为 xxx。# 注意不用加pid gdb bin/observer attach $xxx bt dettach这么操作只会阻塞线程 t,其他线程不受影响。
gdb同样也可能遇到前面章节里没有函数名、没有代码位置的问题,处理方法是将observer.debug文件拷贝到oceanbase/bin目录。
备注
哪些环境会出现这种现象?
obstack 是从 V4.0 某个迭代 OBServer 版本才正式支持 ARM,之前的版本都不支持。
obstack 卡死怎么办?
如果确定卡死,可能是 OBServer 线程持续陷入 kernel 态,把 obstack Kill 掉,直接查看 kernel 栈。
cat /proc/142139/task/*/stack
常见的问题是 NFS、XFS 等文件系统 hang 住,问题转化。
[<0>] __switch_to+0xe8/0x150
[<0>] lock_rename+0x94/0xd0
[<0>] do_renameat2+0x250/0x4e0
[<0>] sys_renameat+0x40/0x58
[<0>] el0_svc_naked+0x44/0x48
其他 obstack 报错的解法

建议安装最新 obstack。
sudo yum install obdevtools-obstack -b test
以上未罗列的 obstack 报错解法
咨询 OceanBase 数据库技术支持团队。
影响租户
影响 OceanBase 数据库中的 SYS 租户,对于 Oracle 租户和 MySQL 租户无影响。
适用版本
OceanBase 数据库 V4.x 版本。
总结
生产版本都不会有代码位置信息,如果确实需要,可以安装
debuginfo包,找到observer.debug文件,命令如下。obstack $pid -d$observer.debug部分早期版本没有代码位置信息,也没有函数符号都没有,这种情况下需要安装
debuginfo包,找到observer.debug文件,命令如下。obstack $pid -s$observer.debug -d$observer.debugobstack不支持 ARM 平台 V4.0 之前的 OBServe 版本,堆栈需要靠其他手段获取。