---
title: obstack 常见问题的解法-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于obstack 常见问题的解法相关的常见问题和使用技巧，帮助您快速解决obstack 常见问题的解法的难题。
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# obstack 常见问题的解法

更新时间：2026-06-08 02:41

适用版本： V4.0.x、V4.1.x、V4.2.x 内容类型：TechNote  

`obstack` 用于实时抓取进程/线程的调用栈，这一点与 `pstack` 是一致的，而且 `obstack` 对进程的影响极小，是无损诊断，因此对生产环境的诊断意义重大。

## 基本功能

### 抓取进程所有线程的调用栈

obstack $pid

### 抓取某个线程的调用栈

obstack $tid -t

### 堆栈聚合

`-a` 参数用于将相同堆栈的线程聚合，便于共性调用链的展示。

### 忽略行号

如果目标进程二进制包含 `debuginfo`，`obstack` 在结果中会输出代码的位置信息，该操作效率较低，`-o` 参数用于关闭之，获得更高的执行效率。

小功能不少，强烈建议只用 `obstack $pid > ps`。

## 常见问题

### 结果只有函数名，没有代码位置信息怎么办？

![image001](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/cluster-management/20241129obstack001.png)

**首先确认自己是否真的需要行号，大多数情况其实是不需要的**，少数情况开发人员可能需要，如果确实需要，继续往下走。

1. 先确认二进制是否包含了`debuginfo`。

   ```shell
   readelf -S bin/observer | grep debug_info

   ```
 2. 没有输出，则需要下载或安装相应版本的 `debuginfo`，找到 `observer.debug` 文件。

   ```shell
   obstack $pid -d$debug_path

   ```

   其中 **$debug_path 为 observer.debug 文件的全路径，-d 后面不要接空格**。

#### 备注

哪些环境会出现这种现象？

生产环境中不加额外的参数，那么默认是无代码位置信息，加了参数指定 debug 路径会有代码信息。

### 结果没有函数符号，全是 `？？？` 怎么办？

![image002](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/cluster-management/20241129obstack002.png)

1. 先确认二进制是否包含了符号表。

   ```shell
   readelf -S bin/observer | grep symtab

   ```shell
   obstack $pid -s$debug_path -d$debug_path

   ```

   其中 `$debug_path` 为 `observer.debug` 文件的全路径，`-s` 后面不要接空格，`-d` 后面不要接空格。

从 V3.x 某个版本开始 OBServer 正式包的二进制自带符号表，不再放入 `debug` 包内，所以仅存量早期版本存在这种问题。

### ARM 环境线程的堆栈层数很少，不正常怎么办？

![image003](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/cluster-management/20241129obstack003.png)

出现这种情况，如果一定要得到堆栈，那么没有其他办法，只能靠 `pstack` 或者 `gdb`。

- 如果环境接受一段时间的进程 hang 死（通常在分钟级），那么可以使用 pstack，使用 `pstack $pid > ps`。
 - 如果不能接受。需要权衡，如果可以接受某个线程 hang 死或者已经明确知道线程已经 hang 死，那么可以用 `gdb` 来取堆栈，假设要抓的线程 id 为 xxx。

  ```shell
  # 注意不用加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` 栈。

```shell
cat /proc/142139/task/*/stack

```

常见的问题是 NFS、XFS 等文件系统 hang 住，问题转化。

```shell
[<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 报错的解法

![image004](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/cluster-management/20241129obstack004.png)

建议安装最新 `obstack`。

```shell
sudo yum install obdevtools-obstack -b test

```

### 以上未罗列的 obstack 报错解法

咨询 OceanBase 数据库技术支持团队。

## 影响租户

影响 OceanBase 数据库中的 SYS 租户，对于 Oracle 租户和 MySQL 租户无影响。

## 适用版本

OceanBase 数据库 V4.x 版本。

## 总结

- 生产版本都不会有代码位置信息，如果确实需要，可以安装 `debuginfo` 包，找到 `observer.debug` 文件，命令如下。

  ```shell
  obstack $pid -d$observer.debug

  ```
 - 部分早期版本没有代码位置信息，也没有函数符号都没有，这种情况下需要安装 `debuginfo` 包，找到 `observer.debug` 文件，命令如下。

  ```shell
  obstack $pid -s$observer.debug -d$observer.debug

  ```
 - `obstack` 不支持 ARM 平台 V4.0 之前的 OBServe 版本，堆栈需要靠其他手段获取。

上一篇

[OBServer 日志中出现 "fail to async schema" 的原因](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000532683)

下一篇

[OBServer 日志中出现 "write log cost too .." 的原因](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000532684) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
