gstack 具体是个啥?

3 阅读2分钟

“gstack”这名字有点容易混淆,我先给你说清楚最常见、也是工程里说的那个👇


一、gstack 是什么(最常见含义)

gstack 是一个 Linux 下的调试工具,本质上是:

👉 用来查看一个正在运行进程的线程调用栈(stack trace)

简单理解一句话:
👉 “快速查看程序现在卡在哪一行代码”


二、它本质上干了啥

gstack 实际上是基于
👉 GDB(GNU调试器)

它做的事情就是:

  • 附加到目标进程
  • 打印所有线程的调用栈
  • 然后退出

三、什么时候用 gstack(非常实用)

典型场景:

1)程序卡住了(最常见)

比如:

  • CPU 不高
  • 程序没响应
  • 接口一直 pending

你就可以:

gstack <pid>

然后会看到类似:

Thread 1:
#0  futex_wait
#1  pthread_cond_wait
#2  xxx_function

👉 你就知道线程卡在哪个函数


2)排查死锁 / 阻塞

  • 多线程程序卡死
  • Java / Python 服务卡住(底层C库也能看到)

3)线上问题排查(无侵入)

相比你去改代码:

👉 gstack 的优点是:

  • 不需要重启
  • 不需要改代码
  • 直接看现场

四、和 pstack / gdb 的区别

你可能会看到这些:

工具作用
gstack打印调用栈(简单快速)
pstack类似工具(某些系统自带)
gdb全功能调试器(更强但更复杂)

👉 关系:

  • gstack = “简化版 gdb 命令封装”

五、举个真实开发场景

比如你在做:
👉 Java / Python 后端服务

线上突然:

  • QPS 降低
  • 请求卡住

你可以:

ps -ef | grep your_app
gstack 12345

你可能会发现:

  • 卡在数据库调用
  • 卡在锁
  • 卡在 IO

👉 这就是定位问题的第一步


六、注意点(别踩坑)

  • 需要权限(通常要 root 或同用户)
  • 对进程有轻微影响(但一般可接受)
  • 输出可能很多(线程多时)

七、别搞混的几个东西

有些人会把 gstack 和这些混:

  • React 的 “stack”(调用栈)❌
  • GPU stack ❌
  • 技术栈(tech stack)❌

👉 这里的 gstack 是:
👉 Linux调试工具