应使用dmesg -t | grep -a 20 -b 5 -e "(kernel panic|oops|bug:|call trace:)"快速定位panic原始日志,-t加时间戳,-a 20取调用栈,-b 5抓前兆;系统重启后优先查/var/log/kern.log.1.gz。

直接看 dmesg 输出里 panic 前后 25 行,重点盯 Call Trace 最底端第一个非通用函数——它大概率就是肇事模块或子系统。
怎么快速抓到 panic 的原始日志片段
默认 dmesg 混着启动日志和日常警告,真正有用的只有 panic 触发前后的上下文。别用 journalctl -b -1 | grep panic,journal 可能根本没捕获到那一瞬间(尤其 kdump 没开或 rsyslog 没配 imkmsg)。
-
dmesg -T | grep -A 20 -B 5 -E "(Kernel panic|Oops|BUG:|Call Trace:)":加-T带时间戳,-A 20往下取调用栈全貌,-B 5往上找前兆(比如连续的ecc error或nvme timeout) - 如果系统已重启,
/var/log/kern.log可能被轮转,优先查/var/log/kern.log.1.gz:zcat /var/log/kern.log.1.gz | grep -A 20 -B 5 "Kernel panic" - 注意:有些嵌入式或精简系统压根不写
/var/log/kern.log,只能靠串口日志或屏幕拍照存档
Call Trace 里哪些符号要立刻警觉
调用栈不是从上往下读,而是从最底端(panic 或 __warn)往上推,找到第一个带方括号的模块名或明显业务子系统函数。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 看到
[nvidia]、[zfs]、[wireguard]?90% 是它——第三方驱动没重编译或版本错配,尤其内核升级后没 rebuild ko - 全是
ext4_writepages、ext4_da_write_begin?文件系统层异常,立刻跑smartctl -a /dev/sda查磁盘健康,检查挂载参数是否用了data=journal这种高风险模式 - 满屏
mm_page_alloc、try_to_unmap、__alloc_pages_slowpath?内存子系统出问题,结合dmesg -T | grep -i "ecc\|correctable\|uncorrectable"看硬件级报错 - 出现
unknown symbol或invalid opcode?内核模块签名/版本不匹配,或 CPU 微码太旧(cpupower frequency-info看 BIOS 更新状态)
vmcore 打不开?先确认三件事
有 /var/crash/vmcore 不代表就能分析——它只是内存快照,没对应调试符号等于一堆乱码。
- 必须用和崩溃内核**完全一致版本**的
vmlinux文件,uname -r输出必须一字不差;CentOS/RHEL 上用debuginfo-install kernel-$(uname -r),别信网上的“通用 debuginfo”包 -
crash工具本身要匹配架构,x86_64 机器不能拿 aarch64 的 crash 二进制去解析 - 如果
kdump服务没真正生效(systemctl status kdump显示 inactive),那/var/crash/下的 vmcore 很可能是上次残留的旧文件,毫无分析价值
真正难的不是看懂 Call Trace,而是判断那个函数是“因”还是“果”——比如 nvme_irq 出现在栈底,不一定是 NVMe 驱动写错了,更可能是内存损坏导致它的回调函数跳到了非法地址。这时候得回溯 -B 5 里的前兆,或者查硬件日志,而不是一头扎进驱动源码里改代码。










