crash —— 查看进程的内核栈的内容

简介: crash —— 查看进程的内核栈的内容

有时我们有这样的需求,想查看某个进程的内核栈里的全部内容,介绍下面的几种做法:

方法1:得到进程的栈底地址以及栈大小,然后使用rd指令读取

  • 使用mach指令获取内核栈的大小
crash> mach | grep SIZE
           MEMORY SIZE: 64 GB
             PAGE SIZE: 4096
     KERNEL STACK SIZE: 16384
        IRQ STACK SIZE: 16384
DOUBLEFAULT STACK SIZE: 8192
        NMI STACK SIZE: 8192
      DEBUG STACK SIZE: 8192
        MCE STACK SIZE: 8192
         VC STACK SIZE: 8192

上面KERNEL STACK SIZE表示的就是内核栈的大小,这里是16KB

  • 获取进程的内核栈栈底

就以出发宕机的CPU上当时运行的进程为例。

crash> task -R stack
PID: 80876    TASK: ffff9519080da880  CPU: 42   COMMAND: "bash"
  stack = 0xffffa4e249fb4000,
  • 读取

rd命令默认是按8字节为单位,所以16KB的话,需要读取2KB,也就是0x800,此外,加入-s选项,这样可以将内核栈里的函数符号翻译成符号名加偏移的格式。

点击查看代码

方法2:直接使用bt -r指令

点击查看代码

方法3:还是使用bt -T/t指令

方法2使用bt指令把内核栈的内容全部输出了出来,输出内容中有很多没有用的内容,此外,bt还提供了-T/t参数,这样会把内核栈里可以解析的部分打印出来

crash> bt -T
PID: 80876    TASK: ffff9519080da880  CPU: 42   COMMAND: "bash"
  [ffffa4e249fb7578] vsnprintf at ffffffffb9f4b8a4
  [ffffa4e249fb75d0] sprintf at ffffffffb9f4bb6e
  [ffffa4e249fb7630] __sprint_symbol at ffffffffb91fbf34
  [ffffa4e249fb7688] symbol_string at ffffffffb9f48185
  [ffffa4e249fb7758] number at ffffffffb9f464e2
  [ffffa4e249fb77d8] number at ffffffffb9f464e2
  [ffffa4e249fb7848] number at ffffffffb9f464e2
  [ffffa4e249fb78b8] vsnprintf at ffffffffb9f4b776
  [ffffa4e249fb7910] sprintf at ffffffffb9f4bb6e
  [ffffa4e249fb7948] desc_read_finalized_seq at ffffffffb919d0b7
  [ffffa4e249fb7970] _prb_read_valid at ffffffffb919d3ac
  [ffffa4e249fb79a0] _raw_spin_trylock at ffffffffb9f71743
  [ffffa4e249fb7a00] prb_read_valid at ffffffffb919e0d7
  [ffffa4e249fb7a10] console_emit_next_record.constprop.0 at ffffffffb9199f83
  [ffffa4e249fb7a48] desc_read_finalized_seq at ffffffffb919d0b7
  [ffffa4e249fb7a50] append_elf_note at ffffffffb91fdb37
  [ffffa4e249fb7a88] crash_save_cpu at ffffffffb91ff6b4
  [ffffa4e249fb7c00] machine_kexec at ffffffffb90839cc
  [ffffa4e249fb7c58] __crash_kexec at ffffffffb91fe047
  [ffffa4e249fb7ce0] __crash_kexec at ffffffffb91fe075
  [ffffa4e249fb7d18] panic at ffffffffb910c471
  [ffffa4e249fb7d40] _printk at ffffffffb91987e0
  [ffffa4e249fb7d98] sysrq_handle_crash at ffffffffb99d2596
  [ffffa4e249fb7da0] __handle_sysrq at ffffffffb99d2b16
  [ffffa4e249fb7dd0] write_sysrq_trigger at ffffffffb99d31b4
  [ffffa4e249fb7de0] proc_reg_write at ffffffffb94ea8e6
  [ffffa4e249fb7de8] preempt_count_add at ffffffffb914c8e7
  [ffffa4e249fb7df8] vfs_write at ffffffffb94404d7
  [ffffa4e249fb7e90] ksys_write at ffffffffb94409eb
  [ffffa4e249fb7ec8] do_syscall_64 at ffffffffb9f5618b
  [ffffa4e249fb7ed8] do_user_addr_fault at ffffffffb909706f
  [ffffa4e249fb7f28] exc_page_fault at ffffffffb9f5b4c0
  [ffffa4e249fb7f50] entry_SYSCALL_64_after_hwframe at ffffffffba0000aa
    RIP: 00007fa6120e0164  RSP: 00007ffe5cf89778  RFLAGS: 00000202
    RAX: ffffffffffffffda  RBX: 0000000000000002  RCX: 00007fa6120e0164
    RDX: 0000000000000002  RSI: 0000564e2104fae0  RDI: 0000000000000001
    RBP: 00007ffe5cf897a0   R8: 0000000000001428   R9: 0000000100000000
    R10: 0000000000000000  R11: 0000000000000202  R12: 0000000000000002
    R13: 0000564e2104fae0  R14: 00007fa6121b4780  R15: 0000000000000002
    ORIG_RAX: 0000000000000001  CS: 0033  SS: 002b

可以看到,把machine_kexec栈帧上面的内存中可以解析成函数名的也打印了出来,对比一下不加-T/t参数的方式:

crash> bt
PID: 80876    TASK: ffff9519080da880  CPU: 42   COMMAND: "bash"
#0 [ffffa4e249fb7c00] machine_kexec at ffffffffb90839cc
#1 [ffffa4e249fb7c58] __crash_kexec at ffffffffb91fe047
#2 [ffffa4e249fb7d18] panic at ffffffffb910c471
#3 [ffffa4e249fb7d98] sysrq_handle_crash at ffffffffb99d2596
#4 [ffffa4e249fb7da0] __handle_sysrq at ffffffffb99d2b16
#5 [ffffa4e249fb7dd0] write_sysrq_trigger at ffffffffb99d31b4
#6 [ffffa4e249fb7de0] proc_reg_write at ffffffffb94ea8e6
#7 [ffffa4e249fb7df8] vfs_write at ffffffffb94404d7
#8 [ffffa4e249fb7e90] ksys_write at ffffffffb94409eb
#9 [ffffa4e249fb7ec8] do_syscall_64 at ffffffffb9f5618b
#10 [ffffa4e249fb7f50] entry_SYSCALL_64_after_hwframe at ffffffffba0000aa
    RIP: 00007fa6120e0164  RSP: 00007ffe5cf89778  RFLAGS: 00000202
    RAX: ffffffffffffffda  RBX: 0000000000000002  RCX: 00007fa6120e0164
    RDX: 0000000000000002  RSI: 0000564e2104fae0  RDI: 0000000000000001
    RBP: 00007ffe5cf897a0   R8: 0000000000001428   R9: 0000000100000000
    R10: 0000000000000000  R11: 0000000000000202  R12: 0000000000000002
    R13: 0000564e2104fae0  R14: 00007fa6121b4780  R15: 0000000000000002
    ORIG_RAX: 0000000000000001  CS: 0033  SS: 002b
相关文章
|
1天前
|
算法 调度
探索操作系统的心脏:内核与进程管理
【10月更文挑战第25天】在数字世界的复杂迷宫中,操作系统扮演着关键角色,如同人体中的心脏,维持着整个系统的生命力。本文将深入浅出地剖析操作系统的核心组件——内核,以及它如何通过进程管理来协调资源的分配和使用。我们将从内核的概念出发,探讨它在操作系统中的地位和作用,进而深入了解进程管理的机制,包括进程调度、状态转换和同步。此外,文章还将展示一些简单的代码示例,帮助读者更好地理解这些抽象概念。让我们一起跟随这篇文章,揭开操作系统神秘的面纱,理解它如何支撑起我们日常的数字生活。
|
2月前
|
算法 调度 Python
探索操作系统的内核——一个简单的进程调度示例
【9月更文挑战第17天】在这篇文章中,我们将深入探讨操作系统的核心组件之一——进程调度。通过一个简化版的代码示例,我们将了解进程调度的基本概念、目的和实现方式。无论你是初学者还是有一定基础的学习者,这篇文章都将帮助你更好地理解操作系统中进程调度的原理和实践。
|
3月前
|
调度 虚拟化 容器
探索操作系统的心脏:内核与进程管理
【8月更文挑战第28天】在数字世界的复杂迷宫中,操作系统扮演着关键角色。它如同一座桥梁,连接硬件与软件,确保一切顺畅运行。本文将深入剖析操作系统的核心——内核和进程管理,揭示它们如何协同工作,保障系统的稳定与高效。通过简化的比喻,我们将一探究竟,了解操作系统背后的神秘面纱。
|
3月前
|
算法 安全 调度
揭秘操作系统的心脏:内核与进程管理
【8月更文挑战第27天】在数字世界的庞大机器中,操作系统扮演着至关重要的角色。本文将深入探讨操作系统的核心组件之一——内核,以及它是如何高效地管理和调度进程的。通过浅显易懂的语言和生动的比喻,我们将一起探索这一技术领域的奥秘,并了解其对整个计算生态的影响。无论你是技术新手还是资深爱好者,这篇文章都将为你打开一扇了解操作系统深层工作机制的大门。
|
3月前
|
存储 算法 调度
操作系统的心脏:内核与进程管理
【8月更文挑战第22天】本文将带你深入探索操作系统的核心——内核,以及它如何通过进程管理来维护系统的稳定运行。我们将从内核的基本概念出发,逐步揭示它在操作系统中的角色和功能,并探讨进程管理的重要性及其对系统性能的影响。文章将用通俗易懂的语言,深入浅出地分析内核与进程管理的相互作用,为你呈现一个清晰、条理化的操作系统内部世界。
|
3月前
|
算法 调度 UED
操作系统的心脏:内核与进程管理
在数字世界的宏伟建筑中,操作系统是那支撑起一切软件运行的基石。本文将深入浅出地探讨操作系统的核心—内核,以及它如何通过进程管理来协调计算机资源的使用。我们将从内核的定义和功能出发,逐步深入到进程的生命周期,以及调度算法的重要性,最终揭示这些机制如何影响我们日常使用的电子设备性能。
41 2
|
2月前
crash —— 输出属于同一个进程的所有线程
crash —— 输出属于同一个进程的所有线程
|
2月前
crash —— 查看进程的mm_struct内容
crash —— 查看进程的mm_struct内容
|
2月前
crash —— 查看进程的vma结构体
crash —— 查看进程的vma结构体
|
3月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。

相关实验场景

更多