Linux Crash工具全解:内核崩溃分析的一切

发布于:2025-05-29 ⋅ 阅读:(16) ⋅ 点赞:(0)

在下实环境下,Linux 内核崩溃是常见但极其糟难寻根问题的环节。而 crash 工具正是用于分析这类内核崩溃环境的精准利器。本文将从原理、实现、环境配置、实战案例等方面全面介绍 crash 工具,帮助学者精通 Linux 内核崩溃分析技术。

一、Crash 工具概念

1.1 是什么?

crash 是 Linux 官方提供的一种内核崩溃分析工具,其功能类似 gdb,但对进程和内核结构体有更好支持,支持操作 vmcore 内容。

1.2 工作原理

  • 在 Linux 内核崩溃时,通过 kexec/kdump 启动备用内核
  • 备用内核把原内核内存全量 dump 成 vmcore
  • crash 通过 vmlinux + vmcore 实现分析

1.3 主要功能

  • 分析内核崩溃堆栈
  • 显示内核进程状态
  • 检视内存、文件系统、虚拟内存分配
  • 查看设备、主机基本信息

在这里插入图片描述

二、Crash 分析需要的文件

2.1 vmlinux

包含了运行时符号、调试信息的完整内核镜像文件

路径示例:

tmp/work-shared/imx8mp/kernel-build-artifacts/vmlinux

2.2 vmcore

由内核崩溃后,kdump 备用内核生成的内存 dump 文件

默认位置:

/proc/vmcore
/var/crash/xxxx/vmcore

三、环境配置过程

3.1 内核配置

确保内核打开下列选项:

CONFIG_KEXEC=y
CONFIG_KEXEC_FILE=y
CONFIG_CRASH_DUMP=y
CONFIG_DEBUG_INFO=y

3.2 Yocto 实环:添加 kexec-tools

IMAGE_INSTALL:append = " kexec-tools "

3.3 U-Boot 启动参数添加 crashkernel

setenv extraargs 'crashkernel=256M'
setenv mmcargs 'setenv bootargs ${mcore_clk} console=${console} ${extraargs} root=${mmcroot}'
saveenv

重启后确认

dmesg | grep -i crash

3.4 手动装载备用内核

kexec -p /boot/Image --append="root=/dev/mmcblk2p2 console=ttymxc1,115200"

四、Crash 基本分析命令

命令 功能说明
log 查看崩溃时的内核日志
bt 调用堆栈分析 (出错函数)
ps 调用崩溃时进程列表
vm 虚拟内存分配情况
kmem -i 内核内存概况
files 进程打开的文件描述符
sys 系统基本信息

示例:

crash> log
crash> bt
crash> ps

五、实战案例:拟真崩溃分析

步骤概述

  1. 启动 kexec -p 备用内核
  2. 手动触发 panic:
echo c > /proc/sysrq-trigger
  1. 备用内核启动,生成 /proc/vmcore
  2. 将 vmcore 拆离到 Ubuntu 主机
  3. 分析
crash vmlinux vmcore

分析点示例

log → 看到 panic: NULL pointer dereference
bt  → 分析出 给了对象为 NULL 即调用了函数
ps  → 现场进程运行在 kworker/线程

六、常见问题和辩解

问题 解决方案
crash: cannot find vmcore file 确保崩溃后启动了 kexec -p 备用内核
crashkernel 设置后无效 确认 U-Boot 传入 bootargs 正确
crash 分析中查不到 symbol 确认使用了带 debug info 的 vmlinux
vmcore 太大无法移动 使用 U 盘 / scp 拆离,或离线分析

七、学习推荐路线

  1. 读懂 crash 基本原理
  2. 配置成功 Yocto + kexec + crashkernel
  3. 重复触发 panic + vmcore 生成
  4. 掌握 crash 分析命令(bt、ps、log、kmem等)
  5. 分析实际高频崩溃问题

推荐阅读《https://crash-utility.github.io/》 官方文档


八、结论

crash 工具是 Linux 内核崩溃分析的重要工具,配合 Yocto 、kexec 、kdump 可实现一套完整的内核错误分析链路。从学习 crash 开始,可以深入了解 Linux 内核的运行结构和进程机制,是成为高级内核工程师的必由之路。