从 pstack 实现来看 /proc 目录

本文通过分析pstack工具的实现,探讨了Linux系统中/proc目录的作用。pstack利用gdb展示了进程的函数堆栈。/proc目录是内核提供的一种接口,将进程的内存映射到文件系统,其中包含如maps、task等子目录,提供了查看进程内存布局、线程信息和文件描述符等详细信息的途径。fd和fdinfo目录存储了进程及线程的文件描述符信息,包括文件偏移量和标志位。
摘要由CSDN通过智能技术生成

从 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值