Linux 内核 panic 分析实战:vmcore 文件结构与 crash 工具详解(含完整案例)
视频教程请关注 B 站:“嵌入式 Jerry”
支持作者新书,点击京东购买《Yocto项目实战教程:高效定制嵌入式Linux系统》
一、引言:为什么需要 vmcore 文件?
在嵌入式 Linux 系统中,内核崩溃(kernel panic)是影响系统稳定性的重要问题。为快速定位和复盘 panic 的根因,Linux 提供了 kdump
机制。它在内核崩溃时触发一个备用内核(crash kernel)来收集内存转储(vmcore
文件),并借助 crash
工具进行离线调试分析。
二、vmcore 文件是什么?
/proc/vmcore
是由 kdump
机制生成的内核转储镜像文件,包含崩溃时主内核的内存快照。它相当于“Linux 的内核黑匣子”,可以被 crash
工具解析,用于:
- 查看 panic 栈回溯(backtrace)
- 分析内存使用情况
- 查看 task 列表、模块加载、锁状态等
三、环境准备
1. 启用 crashkernel 参数
修改 U-Boot 启动命令行或内核参数:
console=ttymxc1,115200 root=/dev/mmcblk2p2 rootwait rw crashkernel=512M
2. 构建备用内核
构建 Image
+ initramfs
并加载:
kexec -p /boot/Image \
--initrd=/boot/initramfs.cpio.gz \
--command-line="root=/dev/mmcblk2p2 maxcpus=1 irqpoll nousb console=ttymxc1,115200"
3. 触发 crash:
echo c > /proc/sysrq-trigger
系统重启进入备用内核并生成 /proc/vmcore
。
四、保存 vmcore 文件
方案 1:自动挂载保存(推荐)
配置 initramfs 中的 kdump.sh
脚本将 /proc/vmcore
保存至 /mnt/vmcore
:
mount /dev/mmcblk2p3 /mnt
cp /proc/vmcore /mnt/vmcore-$(date +%Y%m%d%H%M%S)
方案 2:手动保存
mount /dev/mmcblk2p3 /mnt
cp /proc/vmcore /mnt/vmcore
五、使用 crash 工具分析 vmcore
安装 crash 工具
在 PC 或 Yocto 中 host 编译 crash 工具:
bitbake crash
使用示例:
crash vmlinux vmcore
其中 vmlinux
是未压缩调试版本的内核镜像。
六、实战案例分析:一次 i.MX8MP 平台 panic 排查
1. panic 场景复现
串口输出:
sysrq: Trigger a crash
Kernel panic - not syncing: sysrq triggered crash
说明已通过 sysrq
成功触发 kdump。
2. crash 工具分析命令
crash vmlinux vmcore
输出:
KERNEL: vmlinux
DUMPFILE: vmcore
...
PANIC: sysrq triggered crash
PID: 662
COMMAND: "sh"
3. 查看 backtrace:
bt
可见触发栈:
sysrq_handle_crash
__handle_sysrq
write_sysrq_trigger
4. 查看任务列表
ps
确认系统崩溃时有哪些 task 正在运行,分析资源状态。
七、vmcore 文件结构简述(高级)
vmcore
基于 ELF 格式,包含多个段:
- PT_LOAD 段:主内核物理内存
- NOTE 段:包含 CPU、任务、模块、寄存器等信息
- ELF notes 格式嵌套多个结构体,如 PRSTATUS、VMCOREINFO 等
用 readelf 观察:
readelf -a vmcore | less
八、常见问题排查
问题 | 原因 | 解决方式 |
---|---|---|
vmcore 不存在 | crash kernel 没加载 | 检查 kexec -p |
生成后系统重启太快 | initramfs 中没保存脚本 | 添加 kdump.sh |
crash 加载失败 | vmlinux 不匹配 | 用同一内核构建调试版本 |
九、小结
vmcore 是排查 panic 的关键数据来源,配合 crash 工具可精确定位系统异常。推荐嵌入式平台统一部署 kdump 和备份机制,提升系统可靠性。
十、附录:相关命令速查
# 触发 crash
echo c > /proc/sysrq-trigger
# 加载 crash kernel
kexec -p Image --initrd initramfs.cpio.gz ...
# 保存 vmcore
cp /proc/vmcore /mnt/vmcore
# crash 分析
crash vmlinux vmcore
如需进一步内容讲解与实践操作,请关注视频教程,或阅读作者新书:
视频教程请关注 B 站:“嵌入式 Jerry”