41.11. 分析内核转储
要识别系统崩溃的原因,您可以使用 crash 工具,它提供了一个类似于 GNU Debugger (GDB)的交互式提示。通过使用 crash,您可以分析 kdump、netdump、diskdump 或 xendump ,以及正在运行的 Linux 系统所创建的内核转储。另外,您可以使用 Kernel Oops Analyzer 或 Kdump Helper 工具。
41.11.1. 安装 crash 工具 复制链接链接已复制到粘贴板!
使用提供的信息,了解所需的软件包,以及安装 crash 工具的流程。默认情况下,在 RHEL 8 系统中可能无法安装 crash 工具。crash 是一个在内核崩溃发生和创建内核转储文件时以交互方式分析系统状态的工具。内核转储文件也称为 vmcore 文件。
流程
启用相关的软件仓库:
# subscription-manager repos --enable baseos repository# subscription-manager repos --enable appstream repository# subscription-manager repos --enable rhel-8-for-x86_64-baseos-debug-rpms安装
crash软件包:# yum install crash安装
kernel-debuginfo软件包:# yum install kernel-debuginfo软件包
kernel-debuginfo将对应于正在运行的内核,并提供用于转储分析所需的数据。
41.11.2. 运行和退出 crash 工具 复制链接链接已复制到粘贴板!
crash 工具是一个用于分析 kdump 的强大工具。通过对崩溃转储文件运行 crash,您可以在崩溃时洞察系统的状态,识别问题的根本原因,并对与内核相关的问题进行故障排除。
先决条件
-
确定当前运行的内核(例如
4.18.0-5.el8.x86_64)。
流程
要启动
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>
-
debug-info(解压缩的 vmlinuz 镜像),如
要退出交互式提示并停止
crash,请输入exit或q。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。
流程
- 访问 Kernel Oops Analyzer 工具。
要诊断内核崩溃问题,请上传
vmcore中生成的内核 oops 日志。-
或者,您可以通过提供文本消息或
vmcore-dmesg.txt作为输入来诊断内核崩溃问题。
-
或者,您可以通过提供文本消息或
-
点
DETECT,来根据makedumpfile中的信息,将oops消息与已知解决方案进行比较。
41.11.5. Kdump Helper 工具 复制链接链接已复制到粘贴板!
Kdump Helper 工具有助于使用提供的信息设置 kdump。kdump 帮助程序根据您的偏好生成配置脚本。在服务器中启动并运行该脚本可设置 kdump 服务。