pstack:

pstack命令可显示每个进程的栈跟踪。

pstack 命令必须由相应进程的属主或 root 运行。

可以使用 pstack 来确定进程挂起的位置。

此命令允许使用的唯一选项是要检查的进程的 PID。

pstack 看活动的进程内的堆栈

用法:

root# pstack PID

gstack:

gstack -打印正在运行的进程的堆栈跟踪

使用方法:

gstack PID

描述

gstack连接到命令行中pid的活动进程

打印执行堆栈跟踪。如果ELF符号存在于二进制(usu -)中

如果你没有运行条带(1),那么这个例子就会被打印出来

同样如此。

如果进程是线程组的一部分,那么gstack将打印出一个堆栈

对组中的每个线程进行跟踪。

https://blog.csdn.net/O4dC8OjO7ZL6/article/details/78954755
---------------------

思路分析
我们知道gdb的bt(backtrace)可以打印函数调用栈,但需要手动敲命令执行,不能批量多次运行,似乎不太方便。有没有更好的工具和方法搞定这个需求呢?有的,gstack就是一款用于方便查看函数调用栈的工具。gstack的用途是“print a stack trace of a running process”,即打印一个正在运行的进程的函数调用栈。下面以一个正在运行的redis-server进程为例,执行gstack `pidof redis-server`即可看到该进程当前正在运行的3个线程各自的函数调用栈。这其实与gdb bt看到的差不多,而且我们的目标是只需要函数名,而不需要地址信息,那么gstack有没有什么参数可以去掉每行的地址,以精简打印呢?

如下所示,gstack竟然没有帮助,这不像是一个正常的程序啊。用file `which gstack`查看,果然,它只是一个脚本,并不是一个正常的程序。

查看/usr/bin/gstack脚本源代码,发现它其实只是包装了gdb bt,并用sed对gdb bt的输出结果做了过滤而已。如下给出gstack脚本源代码的解读,该脚本分为五部分:

第一部分:检查是否提供一个入参,如果入参数量不是1,则打印用法提示,并退出脚本。

第二部分:检查入参必须是一个当前正在运行的程序的PID,如果不是,则退出脚本。

第三部分:判断内核是否支持gdb打印所有线程函数栈,如果不支持,则后续会将“bt”命令输入gdb中;如果支持,则后续会将“thread apply all bt”命令输入gdb中。

第四部分:执行gdb,通过“gdb [options] [executable-file] [process-id]”方式附着到指定PID的进程上,通过<<EOF方式为gdb传入多个命令,并将执行输出的结果通过管道“|”传给后续的sed命令。

第五部分:用sed去掉gdb输出的无效行,只提取含有线程信息、函数信息的行。

通过上述对gstack脚本源代码的分析可知,gstack只是gdb bt的简单封装,与我们的目标还有一定差距。看来需要自己编写一些扩展脚本或程序,才能进一步达成目标。

首先,需要编写一个脚本,重复运行多次gstack,采集目标程序足够多次函数调用栈;其次,需要进一步净化数据,比如函数地址信息就需要过滤掉;还有,需要归并出不同的函数调用栈,找到不同的函数调用链,因为gstack输出的函数栈是用Thread行分隔的,可以编写一个程序来解析Thread行,将每个Thread块(多行)放到哈希桶中排重(即,排除重复项),从而得到唯一不同的函数调用链。

三.扩展编程
 首先,编写一个makefile脚本,用shell for循环不断调用gstack,将输出结果追加到临时文本文件中。

仍以redis-server为例,执行 make gstack_log PID=`pidof redis-server` NN=5,即可对redis-server连续运行5次gstack,并将结果保存到一个临时文件tmp_gstack_1353.txt中。在正式采集时,可以将NN设置为很大,比如NN=2000次,以采集到足够多的不同的函数调用栈信息。

然后,查看一下输出的临时文件的内容,即多次gstack输出结果的罗列。下一步需要将每个Thread行所分隔的块(多行),如块1、块2、块3、块4、、、进行净化和排重。

编写一个Node.js小程序gstack_data_format.js,用于对gstack输出结果净化并排重。程序读入gstack结果文件(如:tmp_gstack_1353.txt),一行一行地读入并累加到一个字符串变量中,遇到Thread行则停止累加,并将该字符串作为KEY添加到一个HASH桶中,因为HASH KEY天然不会重复,利用这个特点进行排重;遇到Thread行后,清空该字符串变量,重新开始累加;依次往复,直到读完整个文件。程序基本流程如下,具体源代码请见本文附录。

如下给出gstack_data_format.js的运行效果。该gstack结果文件为1186行,采集到237个函数栈,进行净化、排重后,得到2个唯一不同的函数调用栈。

LINUX 编程定位工具gstack,pstack的更多相关文章

  1. Linux问题定位工具大放送

    我们在程序定位问题时,经常不知所错,但是在linux有很多强大的工具,只要我们合理利用,一定见奇效. 主要会遇到以下问题: 1 mem高 2 cpu高 3 io高 4 网络延迟高 vargrind:h ...

  2. linux编程学习

    linux编程学习 工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习 C 语言编程常常用到的软件和工具. (一)操作系 ...

  3. 【目录】linux 编程

    随笔分类 - linux 编程 Linux编程 24 shell编程(结构化 if [ condition ] 数值比较,字符串比较) 摘要: 一.概述 接着上篇讲的结构化命令,最后讲到了test命令 ...

  4. 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结 转载

    基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...

  5. 【转】牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

    基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...

  6. 面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

    基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...

  7. 77个常用Linux命令和工具

    77个常用Linux命令和工具 Linux管理员不能单靠GUI图形界面吃饭.这就是我们编辑这篇最实用Linux命令手册的原因.这个指南是特别为Linux管理员和系统管理员 设计的,汇集了最有用的一些工 ...

  8. linux 编程技术

    linux 编程技术No.1前期准备工作 GCC的编译过程分为预处理.生成汇编代码.生成目标代码和链接成可执行文件等4个步骤. 使用vim编写C 文件 : [lining@localhost prog ...

  9. Linux编程之给你的程序开后门

    这里说的"后门"并不是教你做坏事,而是让你做好事,搭建自己的调试工具更好地进行调试开发.我们都知道,当程序发生异常错误时,我们需要定位到错误,有时我们还想,我们在不修改程序的前提下 ...

随机推荐

  1. Solve Error: "errcode": 48001, "errmsg": "api unauthorized hint"

    当你想给微信公众号(不是测试账号)自定义菜单创建接口,遇到如下错误: OK Connection: keep-alive Date: Sat, 01 Dec 2018 05:02:08 GMT Con ...

  2. Docker 安装以及运用

    Docker 运行在 CentOS 7 上,要求系统为64位.系统内核版本为 3.10 以上.Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位.系统内核版 ...

  3. 剑指offer——python【第23题】二叉搜索树的后序遍历序列

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路 首先要清楚,这道题不是让你去判断一个给定 ...

  4. jenkins测试配置

  5. php发送邮箱

    /** * 系统邮件发送函数 * @param string $tomail 接收邮件者邮箱 * @param string $name 接收邮件者名称 * @param string $subjec ...

  6. Thymeleaf常用th标签

    https://www.jianshu.com/p/f9ebd23e8da4 关键字 功能介绍 案例 th:id 替换id <input th:id="'xxx' + ${collec ...

  7. 20175320 2018-2019-2 《Java程序设计》第9周学习总结

    20175320 2018-2019-2 <Java程序设计>第9周学习总结 教材学习内容总结 本周学习了教材的第十一章的内容,在这章中介绍了JDBC与Mysql数据库,通过本章我了解到了 ...

  8. Jenkins调度Selenium脚本不能打开浏览器解决办法

    前提:在Myeclipse里面可以启动起来浏览器,在Jenkins中不能启动浏览器 原因:以程序的方式安装了jenkins,jenkins就成了windows的一个服务了,默认是设置为自动启动的如下图 ...

  9. java_基础_类加载

    类加载:Java命令的作用是启动虚拟机,虚拟机通过输入流,从磁盘上将字节码文件(.class文件)中的内容读入虚拟机,并保存起来的过程就是类加载. 类加载特性 :      *在虚拟机的生命周期中一个 ...

  10. ECC椭圆曲线以及计算出公钥的过程(BTC为例)

    ECC概念 全称 “ Ellipse Curve Cryptography ”  means “ 椭圆 曲线 密码学 ”. 传统加密方法大多基于大质数因子分解困难性来实现,ECC则是通过椭圆曲线方程式 ...