Linux 内核 panic 分析实战:vmcore 文件结构与 crash 工具详解(含完整案例)


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

九、小结

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

如需进一步内容讲解与实践操作,请关注视频教程,或阅读作者新书:

支持作者新书,点击京东购买《Yocto项目实战教程:高效定制嵌入式Linux系统》

视频教程请关注 B 站:“嵌入式 Jerry”


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值