pstack 跟踪进程栈

此命令可显示每个进程的栈跟踪,且可显示每个线程的栈状态。pstack 命令必须由相应进程的属主或 root 运行。可以使用 pstack 来确定进程挂起的位置。此命令允许使用的唯一选项是要检查的进程的 PID。请参见 proc(1) 手册页。

这个命令在排查进程问题时非常有用,比如我们发现一个服务一直处于work状态(如假死状态,好似死循环),使用这个命令就能轻松定位问题所在;可以在一段时间内,多执行几次pstack,若发现代码栈总是停在同一个位置,那个位置就需要重点关注,很可能就是出问题的地方;

示例:查看bash程序进程栈:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@xxxxx ]# pstack 16185
Thread 35 (Thread 0x7f098b51e700 (LWP 16186)):
#0 0x00007f09931657fa in sigwaitinfo () from /usr/lib64/libc.so.6
#1 0x0000000000f0f2db in timer_notify_thread_func (arg=arg@entry=0x7ffc2e5b8af0) at /export/home2/pb2/build/sb_1-32013917-1545390379.14/rpm/BUILD/mysql-5.7.25/mysql-5.7.25/mysys/posix_timers.c:77
#2 0x000000000127fae4 in pfs_spawn_thread (arg=0x2fb02b0) at /export/home2/pb2/build/sb_1-32013917-1545390379.14/rpm/BUILD/mysql-5.7.25/mysql-5.7.25/storage/perfschema/pfs.cc:2190
#3 0x00007f0994767dc5 in start_thread () from /usr/lib64/libpthread.so.0
#4 0x00007f099322528d in clone () from /usr/lib64/libc.so.6
Thread 34 (Thread 0x7f097d529700 (LWP 16187)):
#0 0x00007f099455e644 in __io_getevents_0_4 () from /usr/lib64/libaio.so.1
#1 0x0000000000fca3d1 in LinuxAIOHandler::collect (this=this@entry=0x7f097d528de0) at /export/home2/pb2/build/sb_1-32013917-1545390379.14/rpm/BUILD/mysql-5.7.25/mysql-5.7.25/storage/innobase/os/os0file.cc:2506
#2 0x0000000000fcadfd in LinuxAIOHandler::poll (this=this@entry=0x7f097d528de0, m1=m1@entry=0x7f097d528e80, m2=m2@entry=0x7f097d528e88, request=request@entry=0x7f097d528e90) at /export/home2/pb2/build/sb_1-32013917-1545390379.14/rpm/BUILD/mysql-5.7.25/mysql-5.7.25/storage/innobase/os/os0file.cc:2652
#3 0x0000000000fcd436 in os_aio_linux_handler (request=0x7f097d528e90, m2=0x7f097d528e88, m1=0x7f097d528e80, global_segment=0) at /export/home2/pb2/build/sb_1-32013917-1545390379.14/rpm/BUILD/mysql-5.7.25/mysql-5.7.25/storage/innobase/os/os0file.cc:2708
#4 os_aio_handler (segment=segment@entry=0, m1=m1@entry=0x7f097d528e80, m2=m2@entry=0x7f097d528e88, request=request@entry=0x7f097d528e90) at /export/home2/pb2/build/sb_1-32013917-1545390379.14/rpm/BUILD/mysql-5.7.25/mysql-5.7.25/storage/innobase/os/os0file.cc:6254
#5 0x0000000001197d5f in fil_aio_wait (segment=segment@entry=0) at /export/home2/pb2/build/sb_1-32013917-1545390379.14/rpm/BUILD/mysql-5.7.25/mysql-5.7.25/storage/innobase/fil/fil0fil.cc:5854
#6 0x0000000001080458 in io_handler_thread (arg=<optimized out>) at /export/home2/pb2/build/sb_1-32013917-1545390379.14/rpm/BUILD/mysql-5.7.25/mysql-5.7.25/storage/innobase/srv/srv0start.cc:311
#7 0x00007f0994767dc5 in start_thread () from /usr/lib64/libpthread.so.0
#8 0x00007f099322528d in clone () from /usr/lib64/libc.so.6