【ARM Linux 系统稳定性分析入门及渐进 1.3 -- Crash 工具调用】
文章目录
- Crash 工具的调用
- 在实时系统上运行 crash
- 自动查找内核对象文件
- 内核构建要求
- Crash 工具的调用输出
- 成功调用示例
Crash 工具的调用
在使用 crash
工具分析转储文件时,至少需要两个参数:
- 内核对象文件名:通常称为内核 namelist。在最初从内核源代码构建时,其名称是
vmlinux
。在 RHEL3 系统中,该文件被复制到/boot
目录,并附加上操作系统的版本号,例如vmlinux-2.4.21-4.elsmp
。在 RHEL4、RHEL5 和 RHEL6 系统中,vmlinux
文件是内核 debuginfo 包的一部分,位于相关的/usr/lib/debug/lib/modules/<release>
目录中。 - 转储文件名:通常命名为
vmcore
。
例如,如果这两个文件都位于当前目录中,命令格式如下:
crash vmlinux vmcore
在实时系统上运行 crash
在实时系统上运行 crash
时,使用 /dev/mem
作为内存镜像。在 RHEL4、RHEL5 和 RHEL6 系统中,由于在 x86 和 x86_64 系统上限制 /dev/mem
驱动,因此使用 /dev/crash
驱动取而代之。
在这种情况下,只需提供内核对象文件名即可:
crash vmlinux
自动查找内核对象文件
当在实时系统上运行 crash
时,如果内核对象文件位于以下任一目录中,则不需要指定 vmlinux
参数:
/boot
/usr/lib/debug/boot
/usr/lib/debug/lib/modules/<release>
如果在命令行中没有指定 vmlinux
文件,crash
将在以上目录中查找,直到找到与正在运行的内核版本(通过 /proc/version
指示)匹配的内核对象文件为止。如果找到匹配的内核对象文件,则可以简单地通过以下命令在实时系统上调用 crash
:
crash
内核构建要求
在上述示例中,假设 vmlinux
内核是使用 -g
C 标志构建的,而传统上默认并未执行此操作。为了满足该要求,从 Red Hat Enterprise Linux 3(RHEL3)开始,所有 RHEL 内核都使用 -g
C 标志构建。对于 RHEL3、RHEL4、RHEL5 和 RHEL6 内核,访问调试数据的方式在后续章节中描述。不幸的是,由于 RHEL2.1 内核并未使用 -g
编译,因此需要重建内核;RHEL2.1 内核重建的指导可以在官方文档中找到。
Crash 工具的调用输出
在使用 crash
工具时,参数可以以任意顺序输入。如果文件参数不在当前目录中,则必须使用绝对路径名。当不确定如何使用时,可以输入 crash -h
来获取命令行参数的解释。
成功调用示例
假设所有调用参数都正确,以下是一个成功解析转储文件的示例。
KERNEL: vmlinux [TAINTED]DUMPFILES: /var/tmp/ramdump_elf_XXXXXX [temporary ELF header]CPUS: 8 [OFFLINE: 7]DATE: Mon Nov 4 14:17:30 CST 2023UPTIME: 00:05:33
LOAD AVERAGE: 5.33, 3.73, 1.72TASKS: 301NODENAME: rootRELEASE: 6.10-cvs-build-genericVERSION: #24 SMP PREEMPT Fri Nov 1 19:45:34 CST 2024MACHINE: aarch64 (unknown Mhz)MEMORY: 32 GBPANIC: "[core7-pid:5626-thread1]Kernel panic - not syncing: Oops: Fatal exception" (check log for details)PID: 5626COMMAND: "thread1"TASK: ffff00007847d580 [THREAD_INFO: ffff00007847d580]CPU: 4STATE: TASK_RUNNING (PANIC)
crash>
调用成功后,crash
工具将读取内核对象文件和转储文件,并开始对内核崩溃进行分析。输出中将显示内核版本信息、加载的模块、进程列表等有用的调试信息,让用户可以深入分析崩溃原因。