前言:
  最近小组在组织<<深入剖析Nginx>>的读书会, 里面作者提到了pstack这个工具. 之前写JAVA程序, 对jstack这个工具, 非常的喜欢, 觉得很有用. 于是想比较下pstack和jstack的异同.
  和jstack一样, pstack亦能展现进程的线程堆栈快照, 非常方便验证和性能评估. 本文用来简单展示下pstack的使用方式和原理.

pstack使用
  pstack使用非常的简单, 让我们写个简易多线程程序:
  
  编译执行后, 使用pstack体验下:
  
  注: 大秘密, sleep函数貌似是基于nanosleep实现的, ^_^.
  这边我们能清楚的看到两个线程在执行线, 以及当前线程的详细函数栈信息.
  对pstack的作用, 大致可以归纳如下:
  1). 查看线程数(比pstree, 包含了详细的堆栈信息)
  2). 能简单验证是否按照预定的调用顺序/调用栈执行
  3). 采用高频率多次采样使用时, 能发现程序当前的阻塞在哪里, 以及性能消耗点在哪里?
  4). 能反映出疑似的死锁现象(多个线程同时在wait lock, 具体需要进一步验证)
  当然还能举例更多的作用, 相信使用过jstack的coder, 必然深以为然.

pstack原理:
  pstack用途很大, 那其背后的原理是啥?
  可以观察发现, 其实pstack是/usr/bin/gstack的软链接, 而gstack本身是基于gdb封装的shell脚本.
  
  让我们简单分析下这个强大的shell脚本:
  
  注: 由于代码太长, 这边选取最核心的片段, backtrace="thread apply all bt"
  shell采用了here document的方式, 完成了GDB的交互工作(注意EOF标识, 及范围内的交互命令).
  重要的是输入thread apply all bt这个交互命令. 该命令要求输出所有的线程堆栈信息.
  对GDB输出的结果, 通过管道并借助sed命令进行了替换和过滤.

总结:
  pstack其实是gdb的一个功能封装, 但其实现的功能, 确实非常实用. 本文讲述了pstack使用和原理, 以及常见的用途, 下文将讲述死锁检测的一种机制, 欢迎关注.

写在最后:
  
如果你觉得这篇文章对你有帮助, 请小小打赏下. 其实我想试试, 看看写博客能否给自己带来一点小小的收益. 无论多少, 都是对楼主一种由衷的肯定.

  

最新文章

  1. Unity自动寻路Navmesh之高级
  2. UImenuController
  3. C++拼接字符串
  4. Qt5 发布的exe应用程序Windows下无法执行的问题解决方案
  5. Java:包的使用Pack
  6. javascript refresh page 几种页面刷新的方法
  7. 设置c#windows服务描述及允许服务与桌面交互的几种方法(转)
  8. [C++程序设计]有关形参与实参,及返回值说明
  9. man/ls/clock/date/echo笔记
  10. WHAT?【 $.fn.extend() 】vs【 $.extend() 】
  11. 如何在require中使用VUE
  12. spring boot系列03--spring security (基于数据库)登录和权限控制(上)
  13. V4L2驱动的移植与应用(二)
  14. PhantomJS命令行选项
  15. requests使用retry策略
  16. Java开发笔记(四)Java帝国的度量衡
  17. WMware 中CentOS系统Hadoop 分布式环境搭建(一)——Hadoop安装环境准备
  18. Android 代码判断是否有网络
  19. How to recovery compiz
  20. 简单日历dom

热门文章

  1. hduacm 5104
  2. mysql数据库 安装 (原创)
  3. LA 5061 LCA tarjan 算法
  4. MySQL v5.1.72 + v5.6.19
  5. vs2012 .netFramwork2.0发布到xp
  6. NSURLSession使用实战教程
  7. Oracle GoldenGate Veridata 12.1.3已经发布
  8. JavaScript 时间特效 显示当前时间
  9. js 微信分享
  10. 《软件工程》individual project开发小记(一)