当前位置: 首页 > article >正文

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 选项。

# git describe --tags --abbrev=0 2ec220e27f5040aec1e88901c1b6ea3d135787ad
v2.6.28

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

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

[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

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

rsyslogd,pid为1242

[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 性能分析工具的一部分,它可以用来收集性能数据,包括用户态和内核态的堆栈跟踪。例如:

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

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


http://www.kler.cn/a/442824.html

相关文章:

  • Python 实现炸弹人游戏
  • 智星云技术文档:GPU测速教程
  • Java中基于TCP的Socket编程
  • API开发:Flask VS FastAPI
  • 基于RK3588机器人控制器+3D视觉传感器的送餐机器人解决方案
  • 网络编程 02:IP 地址,IP 地址的作用、分类,通过 Java 实现 IP 地址的信息获取
  • 用 Python 格式化器重新定义用户体验
  • open-cv机器视觉相关知识
  • 蓝桥杯刷题——day6
  • 心法利器[122] | 算法面试的八股和非八股讨论
  • 借 SSM 之力,以 Vue 为笔绘就新锐台球厅管理系统设计与实现蓝图
  • NDRCContextUnmarshall断点函数分析之I_RpcBindingCopy函数的作用
  • oracle控制文件发生变化的情况
  • 介绍几个Linux下的杀毒软件
  • 重新定义页签!Choerodon UI Tabs让管理更高效
  • Vue-Form-Making:Star5.5k,一款强大的Vue表单设计器,适用于低代码平台、自定义表单
  • ABAP SQL 取日期+时间最新的一条数据
  • Next.js搜索引擎优化:框架级别的搜索引擎优化能力
  • 【Redis】Redis缓存击穿
  • (3)spring security - 认识PasswordEncoder