从 pstack 实现来看 /proc 目录
实现
pstack 是 Linux 下查看进程运行堆栈的程序,如分析一个进程 ID 为 1518 的程序:
[root@AlexWoo-CentOS ~]# pstack 1518
#0 0x0076c424 in __kernel_vsyscall ()
#1 0x009b2508 in __epoll_wait_nocancel () from /lib/libc.so.6
#2 0x080688c8 in ngx_epoll_process_events ()
#3 0x080613ac in ngx_process_events_and_timers ()
#4 0x0806715f in ngx_worker_process_cycle ()
#5 0x080659b4 in ngx_spawn_process ()
#6 0x08066604 in ngx_start_worker_processes ()
#7 0x080676c7 in ngx_master_process_cycle ()
#8 0x0804b6d3 in main ()
[root@AlexWoo-CentOS ~]#
pstack 其实是一个 Shell 脚本,位于 /usr/bin 目录下
[root@AlexWoo-CentOS ~]# cat /usr/bin/pstack
#!/bin/sh
if test $# -ne 1; then
echo "Usage: `basename $0 .sh` <process-id>" 1>&2
exit 1
fi
# 用于查看指定的进程是否存在
if test ! -r /proc/$1; then
echo "Process $1 not found." 1>&2
exit 1
fi
# 用于查看指定进程是否为多线程运行:
# 对于新的内核,直接查看 /proc/pid/task 下文件数是否大于 1,
# 该目录存放了当前运行进程的所有线程 ID
# 对于旧的内核,查看 /proc/pid/maps 文件中进程是否链接了 pthread 库,
# 这种方法并不一定准确,因为链接了 pthread 库不代表该进程有多线程
# 这里主要原因还是上面说的,gdb 中的 bt 命令只能查看主线程的堆栈,
# 而查看所有线程的堆栈需要使用 thread apply all bt
# GDB doesn't allow "thread apply all bt" when t