pstack是一个基于GDB的工具,用于打印进程线程的调用栈;通过pstack 可查看各线程执行位置,帮助诊断死锁、高CPU等问题,需确保安装gdb并有相应权限。

在Linux系统中,排查进程问题时常需要查看其线程的调用栈信息。pstack是一个实用工具,能快速打印指定进程的函数调用栈,帮助诊断死锁、卡顿或高CPU占用等问题。
pstack 是什么
pstack 是一个基于 GDB 封装的命令行工具,用于输出运行中进程的每个线程当前的函数调用栈(backtrace)。它对调试多线程程序非常有用,尤其适用于无法复现的问题现场分析。
执行 pstack 时,会附着到目标进程并调用 GDB 获取各线程的栈帧信息,然后以可读形式输出。
如何使用 pstack 查看线程调用栈
基本语法:
pstack其中
输出示例:
#0 0x00007f8a1b3e69d3 in __epoll_wait_nocancel () from /lib64/libc.so.6#1 0x00000000004012ab in worker_thread_loop () at worker.c:45
#2 0x00007f8a1bc94ea5 in start_thread () from /lib64/libpthread.so.0
每一行代表一个栈帧,数字越小表示越靠近当前执行点。可以看到线程正在哪个函数中运行。
使用前提与注意事项:- 需安装 gdb 和 pstack 工具包(通常包含在 glibc-utils 或直接提供)
- 目标进程必须运行且未被加固或禁用 ptrace
- 执行用户需与目标进程同属一个用户,或具备 root 权限
- 进程若被 strip 过,函数名可能显示为地址而非符号
常见问题与替代方案
若系统无 pstack,可手动使用 gdb 实现相同功能:
gdb -p 12345 -batch -ex "thread apply all bt" --quiet该命令等价于 pstack 的输出内容。
其他辅助方式还包括:
-
cat /proc/
/stack :显示内核态调用栈(仅限当前调度状态) - perf script:记录函数调用轨迹,适合性能分析
- gdb attach:交互式调试,支持断点和变量查看
实际应用场景
当服务出现无响应时,可通过 pstack 多次抓取调用栈,对比线程是否始终停留在同一位置,判断是否存在死循环或死锁。
对于多线程服务器程序,观察多个线程是否都阻塞在锁操作上,有助于发现同步问题。
基本上就这些。pstack 简单直接,是定位进程级问题的有力工具,虽功能有限但胜在轻量快捷。









