Linux操作系统的pstack工具

Solaris操作系统提供了pstack工具,用来打印运行程序的线程堆栈信息。RedHat公司发行的Linux操作系统(RHELCentOS等等)也提供了pstack工具,只要安装gdb

# yum install gdb

就会把pstack也一并安装成功。

首先看一下pstack

# which pstack
/usr/bin/pstack
# ls -lt /usr/bin/pstack
lrwxrwxrwx. 1 root root 6 Nov 19 06:32 /usr/bin/pstack -> gstack

可以看出pstack实际上只是一个指向了gstack的符号链接。再看一下gstack

# cat /usr/bin/gstack
#!/bin/shif test $# -ne 1; thenecho "Usage: `basename $0 .sh` <process-id>" 1>&2exit 1
fiif test ! -r /proc/$1; thenecho "Process $1 not found." 1>&2exit 1
fi# GDB doesn't allow "thread apply all bt" when the process isn't
# threaded; need to peek at the process to determine if that or the
# simpler "bt" should be used.backtrace="bt"
if test -d /proc/$1/task ; then# Newer kernel; has a task/ directory.if test `/bin/ls /proc/$1/task | /usr/bin/wc -l` -gt 1 2>/dev/null ; thenbacktrace="thread apply all bt"fi
elif test -f /proc/$1/maps ; then# Older kernel; go by it loading libpthread.if /bin/grep -e libpthread /proc/$1/maps > /dev/null 2>&1 ; thenbacktrace="thread apply all bt"fi
fiGDB=${GDB:-/usr/bin/gdb}# Run GDB, strip out unwanted noise.
# --readnever is no longer used since .gdb_index is now in use.
$GDB --quiet -nx $GDBARGS /proc/$1/exe $1 <<EOF 2>&1 |
set width 0
set height 0
set pagination no
$backtrace
EOF
/bin/sed -n \-e 's/^\((gdb) \)*//' \-e '/^#/p' \-e '/^Thread/p'

可以看到gstack仅仅是一个shell脚本。简单浏览一下这个脚本:

(1)

if test $# -ne 1; thenecho "Usage: `basename $0 .sh` <process-id>" 1>&2exit 1
fi

脚本要求一个参数:进程ID

(2)

if test ! -r /proc/$1; thenecho "Process $1 not found." 1>&2exit 1
fi

通过检测/proc目录下进程子目录是否可读,来查看相应进程是否存在。

(3)

# GDB doesn't allow "thread apply all bt" when the process isn't
# threaded; need to peek at the process to determine if that or the
# simpler "bt" should be used.backtrace="bt"
if test -d /proc/$1/task ; then# Newer kernel; has a task/ directory.if test `/bin/ls /proc/$1/task | /usr/bin/wc -l` -gt 1 2>/dev/null ; thenbacktrace="thread apply all bt"fi
elif test -f /proc/$1/maps ; then# Older kernel; go by it loading libpthread.if /bin/grep -e libpthread /proc/$1/maps > /dev/null 2>&1 ; thenbacktrace="thread apply all bt"fi
fi

如果进程只有一个线程,那么使用gdb的“bt”命令打印线程堆栈信息,否则使用“thread apply all bt”命令。

(4)

GDB=${GDB:-/usr/bin/gdb}# Run GDB, strip out unwanted noise.
# --readnever is no longer used since .gdb_index is now in use.
$GDB --quiet -nx $GDBARGS /proc/$1/exe $1 <<EOF 2>&1 |
set width 0
set height 0
set pagination no
$backtrace
EOF
/bin/sed -n \-e 's/^\((gdb) \)*//' \-e '/^#/p' \-e '/^Thread/p'

最后调用gdb,使用“bt”或“thread apply all bt”命令,并把输出重定向到sed工具,由sed工具打印出线程堆栈信息。

最后看一个使用pstack的例子:

# pstack 707
Thread 3 (Thread 0x7f69600d8700 (LWP 713)):
#0  0x00007f6968af269d in poll () at ../sysdeps/unix/syscall-template.S:81
#1  0x00007f6969027a84 in g_main_context_iterate.isra.24 () from /lib64/libglib-2.0.so.0
#2  0x00007f6969027bac in g_main_context_iteration () from /lib64/libglib-2.0.so.0
#3  0x00007f6969027be9 in glib_worker_main () from /lib64/libglib-2.0.so.0
#4  0x00007f696904d4f5 in g_thread_proxy () from /lib64/libglib-2.0.so.0
#5  0x00007f696af9fdc5 in start_thread (arg=0x7f69600d8700) at pthread_create.c:308
#6  0x00007f6968afcced in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
Thread 2 (Thread 0x7f695eec3700 (LWP 716)):
#0  0x00007f6968af269d in poll () at ../sysdeps/unix/syscall-template.S:81
#1  0x00007f6969027a84 in g_main_context_iterate.isra.24 () from /lib64/libglib-2.0.so.0
#2  0x00007f6969027dca in g_main_loop_run () from /lib64/libglib-2.0.so.0
#3  0x00007f6969641336 in gdbus_shared_thread_func () from /lib64/libgio-2.0.so.0
#4  0x00007f696904d4f5 in g_thread_proxy () from /lib64/libglib-2.0.so.0
#5  0x00007f696af9fdc5 in start_thread (arg=0x7f695eec3700) at pthread_create.c:308
#6  0x00007f6968afcced in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
Thread 1 (Thread 0x7f696c5738c0 (LWP 707)):
#0  0x00007f6968af269d in poll () at ../sysdeps/unix/syscall-template.S:81
#1  0x00007f6969027a84 in g_main_context_iterate.isra.24 () from /lib64/libglib-2.0.so.0
#2  0x00007f6969027dca in g_main_loop_run () from /lib64/libglib-2.0.so.0
#3  0x0000560a080a80a3 in main ()

如果使用的Linux发行版没有pstack这个工具,可以考虑直接把gstack脚本拷贝过去。

Linux操作系统的pstack工具相关推荐

  1. Linux 下的 pstack 工具安装及简单应用

    作者 | JiekeXu 来源 | JiekeXu之路(ID: JiekeXu_IT) 转载请联系授权 | (微信ID:xxq1426321293) 大家好,我是 JiekeXu,很高兴又和大家见面了 ...

  2. linux 内核分析工具 Dtrace、SystemTap、火焰图、crash等

    << System语言详解 >> 关于 SystemTap 的书. 我们在分析各种系统异常和故障的时候,通常会用到 pstack(jstack) /pldd/ lsof/ tc ...

  3. gnome硬盘分析_三款基于GUI和终端的实用Linux磁盘扫描工具

    [51CTO.com快译]扫描计算机硬盘主要出于两个原因:一个原因是分析硬盘,找出文件系统的不一致或错误.引起这些问题的可能因素包括:持续的系统崩溃,关键的系统软件关闭不当,更主要的是破坏性程序(比如 ...

  4. linux操作系统的特点有哪些,LINUX操作系统有哪些概念和特点?

    嵌入式LINUX操作系统的概念 以应用为中心,以计算机技术为基础,软件.硬件可裁剪,适应应用系统对功能.可靠性.成本.体积.功耗要求严格的专用计算机系统,称为嵌入式系统.一个最小的嵌入式系统的基本组成 ...

  5. Linux操作系统的进程管理详解

    Linux操作系统的进程管理详解 pkill & pgrep pkill & pgrep 是两个很方便的命令.省去了要先ps auwx | grep xxxx然后再根据pid kill ...

  6. linux操作系统的体系架构,linux操作系统的体系架构_linux操作系统的关机指令

    linux操作系统的体系架构 Linux系统结构一般有3个主要部分:内核kernel.命令解释层Shell或其他操作环境.实用工具. 1.Linux内核 内核是系统的核心,是运行程序和管理磁盘.打印机 ...

  7. linux由哪些部分组成,linux内核处于什么位置?,为你介绍一些Linux操作系统的基础知识(一)...

    今天小编为大家带来的文章是关于Linux操作系统的一些基础知识.喜欢Linux的小伙伴们快来看一看吧. Q1.什么是GNU?Linux与GNU有什么关系? A: 1)GNU是GNU is Not Un ...

  8. VirtualBox在win10下安装一个manjaro linux操作系统的教程

    本篇文章主要分享linux系统中界面比较精美清爽的操作系统manjaro,很适合使用win系统的程序员在虚拟机中安装,方便工作中使用. linux操作系统的特点:可畅快舒服的使用linux的命令语句 ...

  9. linux系统资格认证,Linux资格认证:Linux操作系统的运行级别

    Linux操作系统自从开始启动至启动完毕需要经历几个不同的阶段,这几个阶段就叫做runlevel,同样,当Linux操作系统关闭时也要经历另外几个不同的runlevel,下面我们就准备详细介绍一下ru ...

最新文章

  1. 十二 手游开发神器 cocos2d-x editor 之游戏暂停悬浮层
  2. python3语法错误python_[大数据]Python 3.x中使用print函数出现语法错误(SyntaxError: invalid syntax)的原因 - 码姐姐找文...
  3. 【Java】常见的Eclipse快捷键
  4. 面向对象的三大特征之一继承
  5. 不同品牌机中的“Fn”按钮功能定位汇总
  6. Atitit mq的AMQP 协议 STOMP2 、MQTT3 等协议  MQTT,XMPP,STOMP,AMQP,WAMP 目录 1. AMQP in a Nutshell 1 2. MQTT概述
  7. 汇编语言 王爽 第四版 第二章 检测点2.3
  8. java 找不到符号
  9. 笔记本开热点自动断开
  10. B - The Suspects(并查集)详解
  11. 由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备。 (代码 19)怎么办?
  12. C# 文字视频生成器
  13. sublime text 3搭建Python3的开发环境
  14. 解决mac idea2020打开闪退问题
  15. 如何在MS Project中进行挣值分析
  16. 新玺配资:股票市场中的配股是什么意思
  17. oracle lob 字段清理,Oracle数据库高水位释放——LOB字段空间释放
  18. 硅谷之行 (18) 硅谷-斯坦福-旧金山
  19. 人工智能中的线性代数与矩阵论学习秘诀之精品课程
  20. 计算机网络发展史课程论文,计算机网络的发展史论文..doc

热门文章

  1. Java后端返回前端的日期差9小时?
  2. pcf85263 linux驱动源码,PCF85263AT/AJ
  3. Java干货的“聚宝盆”!各种细节!!
  4. AIOps 在腾讯的探索和实践
  5. 终于有人来盘一盘安卓ASO技巧了,安卓市场aso优化技巧
  6. 虚拟试鞋行业分析及首篇论文解读
  7. 关于前后台部署打包时需要修改的ip位置
  8. # 公有云?私有云?混合云?多云?行业云?傻傻分不清楚(下篇)
  9. 做数据挖掘工作需要具备哪些思维原理?
  10. robosense速腾16线激光雷达配置过程