vmcore是内核崩溃时由kdump生成的原始内存镜像,必须用crash工具配合匹配的vmlinux调试文件才能解析;它不是文本日志,不可用cat或less查看。

vmcore 文件不是普通日志,不能用 cat 或 less 查看——它是一块原始内存镜像,必须用 crash 工具配合对应内核的调试符号文件 vmlinux 才能解析出有效信息。
确认 kdump 是否真正生效并生成了 vmcore
很多“找不到 vmcore”的问题,其实根本没触发成功。先验证三个关键点:
-
grep crashkernel /proc/cmdline必须输出非空结果(如crashkernel=128M@64M或crashkernel=auto),否则内核根本没预留捕获内存 -
systemctl status kdump必须显示active (running),且日志里没有Failed to start Kdump Crash Kernel类错误 - 系统崩溃重启后,检查配置的保存路径(默认是
/var/crash/)下是否有以日期时间命名的子目录,里面应含vmcore(未压缩)或vmcore-dmesg.txt+vmcore(压缩后由makedumpfile生成)
注意:/proc/vmcore 是运行时接口,只在捕获内核中存在;生产内核里访问它会报 No such file or directory。
crash 命令启动失败的常见原因
crash 启动时提示 “cannot find vmlinux” 或 “version mismatch” 是最常卡住的地方。这不是工具装错了,而是符号文件不匹配:
-
vmlinux必须来自与vmcore对应的**同一内核版本+编译配置+调试信息**,/boot/vmlinuz-$(uname -r)是镜像,不是vmlinux;它通常在kernel-debuginfo包里(如 RHEL/CentOS 的kernel-debuginfo-$(uname -r),Ubuntu 的linux-image-$(uname -r)-dbgsym) - 确认
vmlinux有调试段:file vmlinux应含with debug_info;readelf -S vmlinux | grep debug应有多个.debug_*段 - 架构必须严格一致:x86_64 的
vmcore不能用 arm64 的crash打开;crash --version显示的 target 架构要和内核匹配
用 crash 快速定位崩溃源头
进到 crash 交互界面后,别急着翻长列表。先盯住两个命令:
-
log:直接输出崩溃前最后几屏内核日志,OOPS、BUG: unable to handle kernel NULL pointer dereference这类关键线索往往就在这里 -
bt -a:显示所有 CPU 上所有线程的完整调用栈;重点看标有CRASH的那个栈帧,它指向崩溃发生的函数和汇编指令位置 - 如果栈里出现驱动模块名(如
igb、nvidia),再补查:mod -s看模块加载地址,sym查该模块内符号偏移,基本就能锁定问题模块
不用记太多命令——log 和 bt -a 覆盖了 80% 的现场还原需求。
vmcore 文件太大或分析机没环境怎么办
一个 64G 内存机器的 vmcore 可能超 20G,直接拷贝和加载低效。这时有两个务实选择:
- 用
makedumpfile在采集端压缩:makedumpfile -c --message-level 1 -d 31 /proc/vmcore /var/crash/vmcore-compressed,可减小 50–80%,且保留全部调试能力 - 在分析机上不装完整内核包,改用容器化
crash:比如docker run --rm -v $(pwd):/data -it quay.io/centos/centos:stream9 crash /data/vmlinux /data/vmcore,避免污染宿主环境
真正容易被忽略的是:vmcore 分析不依赖生产系统的用户态环境,但 vmlinux 的构建时间必须早于崩溃发生时间——用错一个 patch 版本的 debuginfo,crash 就会静默跳过关键结构体字段。











