“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调试工具