概要
打印运行进程的栈信息(快照),包括一个进程下的所有线程的栈信息。
语法
pstack pid
解释
pstack是封装了 gdb 功能的 shell 脚本,通过 " thread apply all bt " 的命令获得输出所有的线程堆栈信息,再用 sed 进行替换和过滤
# Run GDB, strip out unwanted noise.
$GDB --quiet $readnever -nx /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'
用处
通常在服务运行不符合预期时,可以使用 pstack 来确定进程挂起的位置。比如因为死锁导致服务不响应了,使用该命令会找到照成死锁的代码位置。另一个常见的case是定位死循环,可以在同一时间段内多次执行pstack命令,若发现代码栈总是停在同一个位置,那个位置就需要重点关注,很可能就是出问题的地方
线程执行的时间
如果我们想要查询某一线程已经运行的时间,可以使用以下命令来完成
ps -eLo pid,lwp,pcpu |grep tid
这样可以定位出一些执行得比较慢的线程
参考文献
1、https://www.cnblogs.com/chenxinshuo/p/11986858.html
2、https://www.cnblogs.com/kongzhongqijing/articles/7685699.html