pstack.sh 查看进程堆栈

本文介绍了一个名为pstack.sh的bash脚本,用于获取指定进程的堆栈信息。该脚本通过检查/proc文件系统来确定是否为多线程进程,并相应地使用gdb调用bt或threadapplyallbt命令。适用于Linux环境下对进程状态进行深入分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/bin/bash
if (( $# < 1 ))
then
    echo "usage: `basename $0` pid" 1>&2
    exit 1
fi

if [[ ! -r /proc/$1 ]]
then
    echo "Process $1 not found." 1>&2
    exit 1
fi

backtrace="bt"
if [[ -d /proc/$1/task ]]
then
    if [[ `ls /proc/$1/task 2>/dev/null | wc -l` > 1 ]]
    then
        backtrace="thread apply all bt"
    fi  ;
elif [[ -f /proc/$1/maps ]]
then
    if grep -e libpthread /proc/$1/maps > /dev/null 2>&1
    then
        backtrace="thread apply all bt"
    fi
fi

GDB=gdb

$GDB -quiet -nx /proc/$1/exe -p $1 <<<"$backtrace" |
    sed -n  \
    -e 's/^(gdb) //' \
    -e '/^#/p' \
    -e '/^Thread/p'

使用方法:

pstack.sh pid

 

转载于:https://www.cnblogs.com/yuanping/archive/2013/01/08/2850391.html

<think>好的,用户现在想了解如何在Linux中查看进程堆栈使用情况。之前他已经询问过查看文件系统使用情况的命令,现在转向进程资源方面的内容。需要结合他提供的引用资料和之前的对话来给出合适的回答。 首先,查看用户提供的引用,引用[1]提到了在Linux下查看C/C++程序的堆栈信息的方法,可能涉及gdb调试工具。引用[2]和[3]则提到了一些具体的命令,比如pstack、gstack,以及通过/proc文件系统查看进程信息。引用[4]和[5]涉及进程资源使用情况,包括堆栈大小限制等。 用户的问题明确是“查看进程堆栈使用情况”,这可能包含两个方面:一是查看堆栈的实际内容(调用栈),二是查看堆栈的内存使用情况(如大小)。需要区分这两个方面,并给出对应的命令。 根据引用[2]和[3],pstack和gstack是用来获取进程的调用堆栈信息的,而查看堆栈的内存使用可能需要其他方法,比如通过/proc/pid/maps或pmap命令,或者使用内存分析工具如Valgrind。 另外,用户之前的问题是关于文件系统的命令,现在转向进程资源,可能需要更详细的步骤说明,确保用户能理解不同命令的用途和区别。 需要确保回答结构清晰,分点列出不同的方法,并解释每种方法的适用场景。同时,注意引用对应的参考资料,比如引用[2][3][4]中的相关命令。可能还需要比较不同方法的优缺点,帮助用户选择最合适的工具。 最后,生成相关问题,引导用户进一步学习,比如如何分析堆栈溢出或优化堆栈使用等。</think>#### Linux查看进程堆栈使用情况命令详解 --- ### 一、查看堆栈内存使用量(物理空间) #### 1. **`pmap`命令** **作用**:显示进程的内存映射,包含堆栈段(stack)的物理内存占用[^4]。 **语法**:`pmap [参数] PID` **关键参数**: - `-X`:显示扩展内存详情(推荐) - `-q`:静默模式(仅输出关键信息) **示例**: ```bash # 查看PID为1234的进程内存分布(定位堆栈段) pmap -X 1234 | grep stack # 输出示例: # 00007ffd89d8c000 1320K rw--- [ stack ] ``` **字段解析**: - **地址段**:内存起始地址 - **大小**:堆栈段物理内存占用(示例中1320KB) - **权限**:rw---(可读写的栈空间) --- #### 2. **`proc`文件系统** **作用**:通过`/proc/PID/maps`和`/proc/PID/status`直接查看进程内存布局和堆栈限制[^5]。 **操作步骤**: ```bash # 查看进程内存映射(定位stack标记) cat /proc/1234/maps | grep stack # 查看堆栈大小限制(单位:KB) cat /proc/1234/status | grep -E "Stack|Kb" # 输出示例: # Stack: 1324 kB ``` --- ### 二、查看调用堆栈内容(函数调用链) #### 1. **`pstack`命令** **作用**:直接输出进程当前的函数调用堆栈(需安装gdb调试工具)[^2][^3]。 **语法**:`pstack PID` **示例**: ```bash pstack 1234 # 输出示例: # Thread 1 (LWP 1234): # #0 0x00007f8d5c3d5f20 in __nanosleep_nocancel () # #1 0x00007f8d5c3d5e44 in sleep () # #2 0x000055a7b1d23456 in main () ``` --- #### 2. **`gdb`调试器** **作用**:交互式查看实时堆栈信息(支持多线程调试)[^1][^3]。 **操作步骤**: ```bash # 附加到运行中的进程 gdb -p 1234 # 查看主线程堆栈 (gdb) bt # 查看所有线程堆栈 (gdb) thread apply all bt ``` --- #### 3. **`gstack`脚本** **作用**:类似`pstack`,但兼容性更好(部分系统已弃用`pstack`)[^3][^5]。 **语法**:`gstack PID` **示例**: ```bash gstack 1234 ``` --- ### 三、核心方法对比 | **方法** | **优势** | **局限** | |----------------|-----------------------------------|-----------------------------------| | `pmap` | 显示物理内存占用[^4] | 无法查看函数调用链 | | `pstack/gstack`| 快速获取调用堆栈[^2] | 依赖调试符号表(需编译时保留) | | `gdb` | 支持动态调试和多线程分析[^1] | 需要中断进程执行 | | `/proc`文件系统| 无需额外工具,实时性强[^5] | 数据为原始格式,需手动解析 | --- ### 四、典型问题处理 **Q:为什么`pstack`输出的堆栈信息不完整?** **A**:可能原因: 1. 程序编译时未保留调试符号(编译时添加`-g`参数) 2. 堆栈被优化(编译时避免使用`-O2`等高优化等级) **Q:如何监控堆栈溢出?** **A**:结合以下方法: 1. 通过`ulimit -s`查看系统堆栈大小限制 2. 使用`valgrind --tool=exp-sgcheck`检测堆栈越界 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值