Linux: 通过/proc/pid/stack查看程序卡在内核的什么地方

Linux: 通过/proc/pid/stack查看程序卡在内核的什么地方

机缘巧合吧,用到了这个知识点,记录一下!

1. 谁引入这个漂亮的功能?

patch讨论邮件列表

patch来自Ken Chen,大佬们来回拉扯,最终Ingo赞叹这是个beautiful patch!

[patch] add /proc/pid/stack to dump task's stack trace

哪个commit引入?

哪个版本包含?v2.6.28

git describe 默认会找到距离指定提交最近的标签,并且如果该标签不是直接指向该提交,则会提供额外的信息(如提交数量和哈希)。要获取最近的标签而不包括额外信息,可以使用 --tags 和 --abbrev=0 选项。

bash 复制代码
# git describe --tags --abbrev=0 2ec220e27f5040aec1e88901c1b6ea3d135787ad
v2.6.28

2. 用户线程和内核线程实例

分别以用户线程rsyslogd和内核线程kthreadd为例:

bash 复制代码
[root@CentOS8 ~]# ps -elf | grep -e rsyslogd -e kthreadd
1 S root           2       0  0  80   0 -     0 -      Dec02 ?        00:00:02 [kthreadd]
4 S root        1242       1  0  80   0 - 56463 -      Dec02 ?        00:01:18 /usr/sbin/rsyslogd -n

kthreadd, pid为2

bash 复制代码
[root@CentOS8 ~]# cat /proc/2/stack
[<0>] kthreadd+0x2e8/0x300
[<0>] ret_from_fork+0x1f/0x40

rsyslogd,pid为1242

bash 复制代码
[root@CentOS8 ~]# cat /proc/1242/stack
[<0>] poll_schedule_timeout.constprop.14+0x42/0x70
[<0>] do_select+0x6cb/0x770
[<0>] core_sys_select+0x20e/0x2f0
[<0>] kern_select+0xb5/0x110
[<0>] __x64_sys_select+0x20/0x30
[<0>] do_syscall_64+0x5b/0x1a0
[<0>] entry_SYSCALL_64_after_hwframe+0x65/0xca

3. /proc/pid/stack和其它debug方法的对比

/proc/pid/stack

  • 只反映当前时刻的stack,不同的时间读取的结果可能不一样
  • 显示内核栈,所以对于处于D状态的进程非常有用!

gdb

  • 只能查看进程用户栈
  • 可以打印变量
  • 可以把程序停住!

先用gdb的断点把程序停住,再看/proc/pid/stack,是不是有实用价值的debug方式?

perf

perf 是 Linux 性能分析工具的一部分,它可以用来收集性能数据,包括用户态和内核态的堆栈跟踪。例如:

bash 复制代码
perf record -g -p <pid> sleep 10
perf report

这将在 10 秒内记录进程的性能事件,之后你可以使用 perf report 来查看收集到的数据,包括堆栈跟踪。

/proc/<pid>/wchan

/proc/<pid>/wchan文件是 Linux 内核提供的一个接口,用于显示进程当前正在等待的内核函数或事件。当一个进程处于睡眠状态(即它正在等待某个事件发生,如 I/O 操作完成或信号量可用),wchan 文件会显示该进程在内核中等待的具体函数名称。

4 内核最新代码实现(kernel 6.13-rc2)

ARM/ARM64/Loongarch/x86等架构

CONFIG_STACKTRACE=y

CONFIG_ARCH_STACKWALK=y

cat /proc/pid/stack触发:

-> proc_pid_stack

-> stack_trace_save_regs

-> arch_stack_walk

-> kunwind_stack_walk

mips/arc等架构

CONFIG_STACKTRACE=y

CONFIG_ARCH_STACKWALK=n

​cat /proc/pid/stack触发:

-> proc_pid_stack

-> stack_trace_save_regs

-> save_stack_trace_tsk

欢迎收藏、点赞、关注、留言!

相关推荐
123过去27 分钟前
wifi-honey使用教程
linux·网络·测试工具
志栋智能1 小时前
低成本自动化巡检:7×24小时守护业务稳定
运维·网络·自动化
FreakStudio2 小时前
lvgl-micropython、lv_micropython和lv_binding_micropython到底啥关系?一文读懂
python·单片机·嵌入式·面向对象·电子diy
ToB营销学堂2 小时前
MarketUP | B2B 自动化营销实战:如何打破“营-销”数据孤岛,构建高转化线索流?
运维·自动化
Deitymoon3 小时前
linux——孤儿进程和僵尸进程
linux
CDN3603 小时前
360CDN 全系列产品体验:CDN / 高防 / SDK 游戏盾横向测评
运维·安全·游戏
行者-全栈开发3 小时前
容器化时代来临 - Docker 技术演进与核心价值
运维·docker·容器·cicd·自动化构建·容器化时代
云飞云共享云桌面3 小时前
非标自动化研发成本高?云飞云共享云桌面:1台主机=10台工作站,年省数十万。
大数据·运维·服务器·人工智能·自动化·云计算·电脑
chehaoman4 小时前
Failed to restart nginx.service Unit nginx.service not found
运维·nginx
Linux运维技术栈4 小时前
生产环境Linux应用目录迁移至LVM独立分区 标准化实战方案
linux·运维·服务器·lvm·逻辑卷