41.11. 分析内核转储


要识别系统崩溃的原因,您可以使用 crash 工具,它提供了一个类似于 GNU Debugger (GDB)的交互式提示。通过使用 crash,您可以分析 kdumpnetdumpdiskdumpxendump ,以及正在运行的 Linux 系统所创建的内核转储。另外,您可以使用 Kernel Oops Analyzer 或 Kdump Helper 工具。

41.11.1. 安装 crash 工具

使用提供的信息,了解所需的软件包,以及安装 crash 工具的流程。默认情况下,在 RHEL 8 系统中可能无法安装 crash 工具。crash 是一个在内核崩溃发生和创建内核转储文件时以交互方式分析系统状态的工具。内核转储文件也称为 vmcore 文件。

流程

  1. 启用相关的软件仓库:

    # subscription-manager repos --enable baseos repository
    # subscription-manager repos --enable appstream repository
    # subscription-manager repos --enable rhel-8-for-x86_64-baseos-debug-rpms
  2. 安装 crash 软件包:

    # yum install crash
  3. 安装 kernel-debuginfo 软件包:

    # yum install kernel-debuginfo

    软件包 kernel-debuginfo 将对应于正在运行的内核,并提供用于转储分析所需的数据。

41.11.2. 运行和退出 crash 工具

crash 工具是一个用于分析 kdump 的强大工具。通过对崩溃转储文件运行 crash,您可以在崩溃时洞察系统的状态,识别问题的根本原因,并对与内核相关的问题进行故障排除。

先决条件

  • 确定当前运行的内核(例如 4.18.0-5.el8.x86_64)。

流程

  1. 要启动 crash 工具,请传递以下两个必要的参数:

    • debug-info(解压缩的 vmlinuz 镜像),如 /usr/lib/debug/lib/modules/4.18.0-5.el8.x86_64/vmlinux,通过特定的 kernel-debuginfo 软件包提供。
    • 实际的 vmcore 文件,如 /var/crash/127.0.0.1-2018-10-06-14:05:33/vmcore

      生成的 crash 命令如下所示:

      # crash /usr/lib/debug/lib/modules/4.18.0-5.el8.x86_64/vmlinux /var/crash/127.0.0.1-2018-10-06-14:05:33/vmcore

      使用 kdump 捕获的相同 <kernel> 版本。

      例 41.1. 运行 crash 工具

      以下示例演示了使用 4.18.0-5.el8.x86_64 内核分析在 2018 年 10 月 6 日下午 14:05 时创建的内核转储。

      ...
      WARNING: kernel relocated [202MB]: patching 90160 gdb minimal_symbol values
      
            KERNEL: /usr/lib/debug/lib/modules/4.18.0-5.el8.x86_64/vmlinux
          DUMPFILE: /var/crash/127.0.0.1-2018-10-06-14:05:33/vmcore  [PARTIAL DUMP]
              CPUS: 2
              DATE: Sat Oct  6 14:05:16 2018
            UPTIME: 01:03:57
      LOAD AVERAGE: 0.00, 0.00, 0.00
             TASKS: 586
          NODENAME: localhost.localdomain
           RELEASE: 4.18.0-5.el8.x86_64
           VERSION: #1 SMP Wed Aug 29 11:51:55 UTC 2018
           MACHINE: x86_64  (2904 Mhz)
            MEMORY: 2.9 GB
             PANIC: "sysrq: SysRq : Trigger a crash"
               PID: 10635
           COMMAND: "bash"
              TASK: ffff8d6c84271800  [THREAD_INFO: ffff8d6c84271800]
               CPU: 1
             STATE: TASK_RUNNING (SYSRQ)
      
      crash>
  2. 要退出交互式提示并停止 crash,请输入 exitq

    crash> exit
    ~]#
注意

crash 命令也作为一个调试实时系统的强大工具被使用。但是,您必须谨慎使用它,以避免系统级的问题。

41.11.3. 在 crash 工具中显示各种指示符

使用 crash 工具来显示各种指示符,如内核消息缓冲区、回溯追踪、进程状态、虚拟内存信息以及打开文件。

显示消息缓冲

  • 要显示内核消息缓冲区,请在互动提示符下输入 log 命令:

    crash> log
    ... several lines omitted ...
    EIP: 0060:[<c068124f>] EFLAGS: 00010096 CPU: 2
    EIP is at sysrq_handle_crash+0xf/0x20
    EAX: 00000063 EBX: 00000063 ECX: c09e1c8c EDX: 00000000
    ESI: c0a09ca0 EDI: 00000286 EBP: 00000000 ESP: ef4dbf24
     DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
    Process bash (pid: 5591, ti=ef4da000 task=f196d560 task.ti=ef4da000)
    Stack:
     c068146b c0960891 c0968653 00000003 00000000 00000002 efade5c0 c06814d0
    <0> fffffffb c068150f b7776000 f2600c40 c0569ec4 ef4dbf9c 00000002 b7776000
    <0> efade5c0 00000002 b7776000 c0569e60 c051de50 ef4dbf9c f196d560 ef4dbfb4
    Call Trace:
     [<c068146b>] ? __handle_sysrq+0xfb/0x160
     [<c06814d0>] ? write_sysrq_trigger+0x0/0x50
     [<c068150f>] ? write_sysrq_trigger+0x3f/0x50
     [<c0569ec4>] ? proc_reg_write+0x64/0xa0
     [<c0569e60>] ? proc_reg_write+0x0/0xa0
     [<c051de50>] ? vfs_write+0xa0/0x190
     [<c051e8d1>] ? sys_write+0x41/0x70
     [<c0409adc>] ? syscall_call+0x7/0xb
    Code: a0 c0 01 0f b6 41 03 19 d2 f7 d2 83 e2 03 83 e0 cf c1 e2 04 09 d0 88 41 03 f3 c3 90 c7 05 c8 1b 9e c0 01 00 00 00 0f ae f8 89 f6 <c6> 05 00 00 00 00 01 c3 89 f6 8d bc 27 00 00 00 00 8d 50 d0 83
    EIP: [<c068124f>] sysrq_handle_crash+0xf/0x20 SS:ESP 0068:ef4dbf24
    CR2: 0000000000000000

    输入 help log 以了解有关命令用法的更多信息。

    注意

    内核消息缓冲区包含有关系统崩溃的最重要的信息。它始终首先转储到 vmcore-dmesg.txt 文件中。如果您无法获取完整的 vmcore 文件,例如由于目标位置上空间不足,则您可以从内核消息缓冲中获得所需的信息。默认情况下,vmcore-dmesg.txt 放在 /var/crash/ 目录中。

显示后端

  • 若要显示内核堆栈跟踪,可使用 bt 命令。

    crash> bt
    PID: 5591   TASK: f196d560  CPU: 2   COMMAND: "bash"
     #0 [ef4dbdcc] crash_kexec at c0494922
     #1 [ef4dbe20] oops_end at c080e402
     #2 [ef4dbe34] no_context at c043089d
     #3 [ef4dbe58] bad_area at c0430b26
     #4 [ef4dbe6c] do_page_fault at c080fb9b
     #5 [ef4dbee4] error_code (via page_fault) at c080d809
        EAX: 00000063  EBX: 00000063  ECX: c09e1c8c  EDX: 00000000  EBP: 00000000
        DS:  007b      ESI: c0a09ca0  ES:  007b      EDI: 00000286  GS:  00e0
        CS:  0060      EIP: c068124f  ERR: ffffffff  EFLAGS: 00010096
     #6 [ef4dbf18] sysrq_handle_crash at c068124f
     #7 [ef4dbf24] __handle_sysrq at c0681469
     #8 [ef4dbf48] write_sysrq_trigger at c068150a
     #9 [ef4dbf54] proc_reg_write at c0569ec2
    #10 [ef4dbf74] vfs_write at c051de4e
    #11 [ef4dbf94] sys_write at c051e8cc
    #12 [ef4dbfb0] system_call at c0409ad5
        EAX: ffffffda  EBX: 00000001  ECX: b7776000  EDX: 00000002
        DS:  007b      ESI: 00000002  ES:  007b      EDI: b7776000
        SS:  007b      ESP: bfcb2088  EBP: bfcb20b4  GS:  0033
        CS:  0073      EIP: 00edc416  ERR: 00000004  EFLAGS: 00000246

    输入 bt <pid> 来显示特定进程的回溯追踪,或者输入 help bt 以了解有关 bt 用法的更多信息。

显示进程状态

  • 若要显示系统中进程的状态,可使用 ps 命令。

    crash> ps
       PID    PPID  CPU   TASK    ST  %MEM     VSZ    RSS  COMM
    >     0      0   0  c09dc560  RU   0.0       0      0  [swapper]
    >     0      0   1  f7072030  RU   0.0       0      0  [swapper]
          0      0   2  f70a3a90  RU   0.0       0      0  [swapper]
    >     0      0   3  f70ac560  RU   0.0       0      0  [swapper]
          1      0   1  f705ba90  IN   0.0    2828   1424  init
    ... several lines omitted ...
       5566      1   1  f2592560  IN   0.0   12876    784  auditd
       5567      1   2  ef427560  IN   0.0   12876    784  auditd
       5587   5132   0  f196d030  IN   0.0   11064   3184  sshd
    >  5591   5587   2  f196d560  RU   0.0    5084   1648  bash

    使用 ps <pid> 显示单个进程的状态。使用 help ps 了解有关 ps 用法的更多信息。

显示虚拟内存信息

  • 要显示基本虚拟内存信息,请在交互式提示符下键入 vm 命令。

    crash> vm
    PID: 5591   TASK: f196d560  CPU: 2   COMMAND: "bash"
       MM       PGD      RSS    TOTAL_VM
    f19b5900  ef9c6000  1648k    5084k
      VMA       START      END    FLAGS  FILE
    f1bb0310    242000    260000 8000875  /lib/ld-2.12.so
    f26af0b8    260000    261000 8100871  /lib/ld-2.12.so
    efbc275c    261000    262000 8100873  /lib/ld-2.12.so
    efbc2a18    268000    3ed000 8000075  /lib/libc-2.12.so
    efbc23d8    3ed000    3ee000 8000070  /lib/libc-2.12.so
    efbc2888    3ee000    3f0000 8100071  /lib/libc-2.12.so
    efbc2cd4    3f0000    3f1000 8100073  /lib/libc-2.12.so
    efbc243c    3f1000    3f4000 100073
    efbc28ec    3f6000    3f9000 8000075  /lib/libdl-2.12.so
    efbc2568    3f9000    3fa000 8100071  /lib/libdl-2.12.so
    efbc2f2c    3fa000    3fb000 8100073  /lib/libdl-2.12.so
    f26af888    7e6000    7fc000 8000075  /lib/libtinfo.so.5.7
    f26aff2c    7fc000    7ff000 8100073  /lib/libtinfo.so.5.7
    efbc211c    d83000    d8f000 8000075  /lib/libnss_files-2.12.so
    efbc2504    d8f000    d90000 8100071  /lib/libnss_files-2.12.so
    efbc2950    d90000    d91000 8100073  /lib/libnss_files-2.12.so
    f26afe00    edc000    edd000 4040075
    f1bb0a18   8047000   8118000 8001875  /bin/bash
    f1bb01e4   8118000   811d000 8101873  /bin/bash
    f1bb0c70   811d000   8122000 100073
    f26afae0   9fd9000   9ffa000 100073
    ... several lines omitted ...

    使用 vm <pid> 显示有关单个特定进程的信息,或使用 help vm 了解有关 vm 用法的更多信息。

显示打开的文件

  • 要显示有关打开文件的信息,请使用 files 命令。

    crash> files
    PID: 5591   TASK: f196d560  CPU: 2   COMMAND: "bash"
    ROOT: /    CWD: /root
     FD    FILE     DENTRY    INODE    TYPE  PATH
      0  f734f640  eedc2c6c  eecd6048  CHR   /pts/0
      1  efade5c0  eee14090  f00431d4  REG   /proc/sysrq-trigger
      2  f734f640  eedc2c6c  eecd6048  CHR   /pts/0
     10  f734f640  eedc2c6c  eecd6048  CHR   /pts/0
    255  f734f640  eedc2c6c  eecd6048  CHR   /pts/0

    使用 files <pid> 仅显示一个选定进程打开的文件,或者使用 help files 来获取有关 files 用法的更多信息。

41.11.4. 使用 Kernel Oops Analyzer

Kernel Oops Analyzer 工具通过将 oops 消息与知识库中的已知问题进行比较,来分析崩溃转储。

先决条件

  • oops 消息被安全地提供给 Kernel Oops Analyzer。

流程

  1. 访问 Kernel Oops Analyzer 工具。
  2. 要诊断内核崩溃问题,请上传 vmcore 中生成的内核 oops 日志。

    • 或者,您可以通过提供文本消息或 vmcore-dmesg.txt 作为输入来诊断内核崩溃问题。
  3. DETECT,来根据 makedumpfile 中的信息,将 oops 消息与已知解决方案进行比较。

41.11.5. Kdump Helper 工具

Kdump Helper 工具有助于使用提供的信息设置 kdump。kdump 帮助程序根据您的偏好生成配置脚本。在服务器中启动并运行该脚本可设置 kdump 服务。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部