Linux下有时候我们需要知道一个进程在做什么,比如说程序不正常的时候,他到底在干吗?最直接的方法就是打印出他所有线程的调用栈,这样我们从栈再配合程序代码就知道程序在干吗了。

Linux下这个工具叫做pstack. 使用方法是

# pstack

Usage: pstack

当然这个被调查的程序需要有符号信息。 比较雷人的是 这个程序竟然是个shell脚本,核心实现是gdb的 thread apply all bt, 我们可以观摩下他的实现,这个我们做类似的程序提供了一个很好的思路:

[root@=i ~]# cat `which pstack`

#!/bin/sh

if test $# -ne 1; then

echo “Usage: `basename $0 .sh` ” 1>&2

exit 1

fi

if test ! -r /proc/$1; then

echo “Process $1 not found.” 1>&2

exit 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 ; then

backtrace=”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 ; then

backtrace=”thread apply all bt”

fi

fi

GDB=${GDB:-/usr/bin/gdb}

if $GDB -nx –quiet –batch –readnever > /dev/null 2>&1; then

readnever=–readnever

else

readnever=

fi

# Run GDB, strip out unwanted noise.

$GDB –quiet $readnever -nx /proc/$1/exe $1

$backtrace

EOF

/bin/sed -n \

-e ‘s/^(gdb) //’ \

-e ‘/^#/p’ \

-e ‘/^Thread/p’

祝大家玩的开心。

pstack 安装linux_Linux下pstack的实现相关推荐

  1. pstack 安装linux_linux下的进程堆栈查看工具pstack

    pstack在linux上是一个非常有用的工具,可以查看进程内部调用函数的信息.可惜的是在ubuntu10.10版本中没有找到这个工具.无奈,只能下载尝试编译了. 首先安装编译环境,使用如下命令: a ...

  2. pstack 安装linux_linux下跟踪进程调用栈strace pstack gstack

    pstack PID gstack PID top -H -p PID 引子: 1.在Linux系统中,进程状态除了我们所熟知的TASK_RUNNING,TASK_INTERRUPTIBLE,TASK ...

  3. mysql 一键安装 linux_linux下mysql8 shell脚本一键安装

    1:下载mysql8文件 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.18-el7-x86_64.tar.gz 2:新建一个my.cnf文 ...

  4. php rewrite模块安装,Linux_Linux下Apache安装/增加mod_rewrite模块,如果你的服务器apache还没有安 - phpStudy...

    Linux下Apache安装/增加mod_rewrite模块 如果你的服务器apache还没有安装,那很简单,在编译apache时将mod_rewrite模块编译进去就可以,相关文档可以在http:/ ...

  5. kali kda安装 linux_Linux下添加打印机【解决HP系列驱动问题】

    很多HP打印机Linux下驱动不完善,例如1020... 用apt install hplip解决不了问题,下面参考http://foo2zjs.rkkda.com/,提供一个解决办法 安装驱动 # ...

  6. mysql 5.6安装 linux_linux下MySQL5.6安装记录

    MySQL下载地址: ftp://mirror.switch.ch/mirror/mysql/Downloads/MySQL-5.6/ http://mirrors.sohu.com/mysql/ 1 ...

  7. pg安装部署linux_Linux下postgresql数据库部署与配置

    1.检查postgresql是否已经安装:rpm -qa | grep postgres 2.检查PostgreSQL 安装位置:rpm -qal | grep postgres 3.卸载Postgr ...

  8. linux mysql5.7.11安装_Linux下安装MySQL 5.7.11

    拷贝mysql5.7安装包 bash-4.1# cp /mnt/hgfs/Downloads/mysql-5.7.11-1.el6.x86_64.rpm-bundle.tar /home 解压安装包 ...

  9. ubuntu 安装linux 下vmVMware tools 步骤及问题解决

    ubuntu 安装linux 下vmVMware tools 步骤及问题解决 参考文章: (1)ubuntu 安装linux 下vmVMware tools 步骤及问题解决 (2)https://ww ...

最新文章

  1. Spark SQL 源代码分析系列
  2. 【Android APT】编译时技术 ( ButterKnife 原理分析 )
  3. Java SE 重点知识笔记
  4. 无法启动mysqll1006_CentOS7下MySQL服务启动失败原因及解决方法
  5. catia螺纹孔在二维图上不显示_螺钉的螺纹是搓牙加工的,那么螺母的螺纹是怎么加工的呢...
  6. ArrayListd的长度问题
  7. 卧槽!jmeter 竟然这么牛逼,压测爽歪歪~
  8. Linux 中ifconfig和ip addr命令看不到ip
  9. 推荐几个e书下载地址
  10. JavaScript视频系统教程
  11. fastjson不序列化空属性,解决办法
  12. FFMpeg TS转成mp4命令
  13. 老将引退AMD换血成功
  14. Linux网络流量控制工具—Netem
  15. 数据传输/文件传输:两台电脑怎么传文件?
  16. 突然不能从主机向虚拟机上拷贝文件了
  17. 神经网络学习笔记(四)
  18. 学生成绩分析报告数据分析可视化python实现源码seaborn、matplotlib
  19. Javascript 模板模式
  20. mysql的mvcc和lbcc

热门文章

  1. html 控制横向打印机,hp LaserJet 1000打印机怎么设置实现横向打印?
  2. Vue中视频组件vue-video-player
  3. 运用MATLAB批量读取excel表格
  4. Shiro(4)整合SpringBoot2.x
  5. 朔日计算机基础答案,大學计算机基础课程练习系统使用手册.doc
  6. Visual C++网络编程经典案例详解 第5章 网页浏览器 CHtmlView类 查看源文件
  7. UNI-APP隐私政策问题无法上架
  8. linux 复制并替换文件,linux – 复制/ Tarring在过去14天内修改过的文件
  9. 微信小程序-如何申请百度开放平台的密钥
  10. 少儿编程----颜值打分系统