在下实环境下,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
五、实战案例:拟真崩溃分析
步骤概述
- 启动 kexec -p 备用内核
- 手动触发 panic:
echo c > /proc/sysrq-trigger
- 备用内核启动,生成 /proc/vmcore
- 将 vmcore 拆离到 Ubuntu 主机
- 分析
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 拆离,或离线分析 |
七、学习推荐路线
- 读懂 crash 基本原理
- 配置成功 Yocto + kexec + crashkernel
- 重复触发 panic + vmcore 生成
- 掌握 crash 分析命令(bt、ps、log、kmem等)
- 分析实际高频崩溃问题
推荐阅读《https://crash-utility.github.io/》 官方文档
八、结论
crash 工具是 Linux 内核崩溃分析的重要工具,配合 Yocto 、kexec 、kdump 可实现一套完整的内核错误分析链路。从学习 crash 开始,可以深入了解 Linux 内核的运行结构和进程机制,是成为高级内核工程师的必由之路。