当前位置: 首页 > news >正文

Linux 进程调试神器:pstack 命令详解,一键打印线程调用栈定位死锁 / 卡顿

Linux 学习资料 https://pan.baidu.com/s/1A6qqBk2ViE_Le2cQjSowkQ?pwd=7uz8

一、命令简介

pstack 是一个用于显示指定进程的栈跟踪(stack trace)信息的命令行工具。它能够输出进程内所有线程的调用栈,这对于调试程序挂起、死锁或性能瓶颈等问题非常有用。该命令通常需要由目标进程的属主用户或 root 用户执行。

二、语法格式

bash

运行

pstack [选项] <进程ID (PID)>

参数说明:

  • <进程ID (PID)>:必需参数,指定要查看栈跟踪的目标进程的进程 ID。

三、常用选项及说明

pstack 命令本身通常没有复杂的选项。其核心功能就是接受一个进程 PID 作为参数。在某些发行版或实现中,可能会支持以下选项:

表格

选项说明
-h, --help显示帮助信息。
-V, --version显示版本信息。

注意:pstack 的实现可能因 Linux 发行版而异。在一些系统中,它可能是一个简单的 shell 脚本包装器,调用 gstack 或 gdb 来实现功能。最可靠的方式是查看您系统上 pstack 的手册页 (man pstack)。

四、示例用法

示例 1:查看指定进程的栈跟踪

这是最基础的用法,直接提供进程 PID。

bash

运行

sudo pstack 1234

输出将显示进程 1234 中每个线程的调用栈,格式类似于:

text

Thread 1 (Thread 0x7f8a5a7fe700 (LWP 1234)): #0 0x00007f8a59e8bf0d in nanosleep () from /lib64/libc.so.6 #1 0x00007f8a59e8bd94 in sleep () from /lib64/libc.so.6 #2 0x0000561f3a4a5a1b in main ()

示例 2:结合 ps 和 grep 命令定位并分析进程

首先,使用 ps 命令找到目标进程的 PID,然后使用 pstack 进行分析。

bash

运行

# 1. 查找名为 “my_server” 的进程 ps aux | grep my_server # 假设输出显示 PID 为 4551 # 2. 查看该进程的栈跟踪 sudo pstack 4551

输出将详细列出进程 4551 中所有线程的栈帧,帮助开发者理解程序在特定时刻的执行路径和状态。

示例 3:分析多线程程序的线程状态

对于一个多线程程序(如示例中 PID 为 4551 的进程),pstack 会清晰地列出每个线程(LWP,轻量级进程)的栈跟踪。

bash

运行

sudo pstack 4551

典型输出结构如下,可以看到主线程(Thread 1)和多个工作线程(Thread 2-N)各自在执行的函数调用链:

text

Thread 7 (Thread 0x7f3c2b7fe700 (LWP 4552)): #0 0x00007f3c2a5d23dc in epoll_wait () from /lib64/libc.so.6 #1 0x000055a1b2a01730 in ub::EPollEx::poll () ... Thread 1 (Thread 0x7f3c2c7fe700 (LWP 4551)): #0 0x00007f3c2a59b1a5 in __nanosleep_nocancel () from /lib64/libc.so.6 #1 0x00007f3c2a59b010 in sleep () from /lib64/libc.so.6 #2 0x000055a1b29a0d79 in Ad_preprocess::run ()

五、注意事项

  • 权限要求:pstack 需要访问目标进程的内存空间,因此通常必须由 root 用户或目标进程的属主用户运行。普通用户无法查看其他用户进程的栈信息。
  • 进程状态:pstack 会短暂挂起(ptrace)目标进程以获取其内存信息。对于生产环境中关键的核心服务,需谨慎使用,避免对服务造成影响。
  • 依赖关系:pstack 的功能依赖于系统的调试信息和 ptrace 系统调用。如果目标进程被剥离了符号表(strip),输出的栈跟踪中函数名可能显示为内存地址,可读性会变差。
  • 命令可用性:并非所有 Linux 发行版都默认安装 pstack。如果找不到该命令,可能需要安装 gdb(GNU 调试器),因为 pstack 有时是 gdb 的一个脚本或功能别名。您也可以直接使用 gdb -p <PID> 然后输入 thread apply all bt 命令来达到类似效果。
  • 输出解读:栈跟踪的输出是从当前执行点(#0)向调用者(#1, #2...)回溯。#0 通常是线程当前阻塞或正在执行的函数。这对于定位死锁(多个线程互相等待锁)或无限循环非常有效。

Linux 学习资料 https://pan.baidu.com/s/1A6qqBk2ViE_Le2cQjSowkQ?pwd=7uz8

http://www.jsqmd.com/news/1164464/

相关文章:

  • 2026年7月最新惠州万国官方售后联系电话与客户服务中心网点地址 - 万国中国官方服务中心
  • 当一个写代码的人开始羡慕搬砖,他到底在羡慕什么
  • 在 ARM NEON 上榨干每一条指令:TensorFlow Lite XNNPACK 代理从算子委托到底层汇编的深度剖析
  • 2026年工业园区分布式光伏施工服务商推荐 - 品牌排行榜
  • 网络调试的瑞士军刀:如何用PacketSender解决协议开发的三大痛点
  • STM32F103C8T6 智能家居网关实战:ESP8266 + MQTT 连接阿里云 IoT 平台
  • STC8 单片机蜂鸣器播放音乐
  • 破解PET/CT肿瘤分割模态失衡与小病灶漏检问题
  • GRPO强化学习与LoRA微调:提升Gemma-3数学推理能力实践
  • AssetStudio:Unity资源查看与提取工具的核心原理与实战指南
  • # 2026银川离婚律师怎么挑?5个选律师标准防踩雷推荐 - 本地品牌推荐
  • A3910与PIC18F25K50电机控制方案解析
  • 【一线大厂Java面试题合集】第05篇-反射机制与动态代理
  • syscontainer-tools 网络管理指南:轻松添加和移除容器网络接口的终极教程
  • 2026年7月最新东莞萧邦官方售后客服电话及服务网点地址查询 - 萧邦中国官方服务中心
  • 多旋翼无人机安全操控实战:基于UOM法规的10个关键场景与应对方案
  • 离线版设备故障诊断智能体——基于国产麒麟系统的文本数据诊断方案
  • 3D Transformer实战:解决PET/CT大病灶边界模糊与全局特征缺失问题
  • 2026年7月最新徐州帝舵官方售后服务热线与网点地址查询 - 帝舵中国官方服务中心
  • about learning English (2026.07.10)
  • DHT11 温湿度传感器 3 种主流库对比:Adafruit vs markruys vs DFRobot 实测
  • 智能体平台提供单元测试和集成测试工具吗?——2026年企业级Agent测试能力深度解析与方案对比
  • Runway Agent Skills:AI编程助手集成媒体生成能力的技术解析
  • 2026年山东市场高性价比自动售卖机厂家综合推荐指南 - 品牌鉴赏官2026
  • STM32F042K6与ADS131M02高精度ADC数据采集方案详解
  • 蓝牙5.4音频传输方案:IDC777-1模块与PIC18F4610实战
  • 使用 Java Project Manager 扩展快速创建 Maven 或 Gradle 项目
  • 免费数字人平台一个月到底要花多少钱?老板IP、门店短视频、跨境团队三种场景算一笔账
  • FPG财盛国际:长期一致性的细节盘点
  • 2026年玉溪别墅装修优质企业甄选与推荐 - 品牌鉴赏官2026