0

0

内核 panic 生成 vmcore 后如何用 crash 提取调用栈关键信息

冷炫風刃

冷炫風刃

发布时间:2026-01-19 17:22:38

|

644人浏览过

|

来源于php中文网

原创

crash 提取调用栈关键信息的核心是定位崩溃上下文,需确保 vmcore 完整、vmlinux 匹配且 crash 版本兼容;通过 log/sys/mach 初步确认 panic 现场,再用 bt、reg、dis、rd 等命令结合寄存器与内存分析根因。

内核 panic 生成 vmcore 后如何用 crash 提取调用栈关键信息

内核 panic 生成 vmcore 后,用 crash 提取调用关键信息的核心是定位崩溃时的上下文——尤其是触发 panic 的 CPU、当前进程、寄存器状态和函数调用链。只要 vmcore 和对应内核的 vmlinux(带调试符号)齐全,crash 工具能快速还原现场。

确认环境准备就绪

crash 无法解析 vmcore 的常见原因是缺少匹配的 vmlinux 文件(不是 /boot/vmlinuz,而是带调试信息的编译产物,通常在内核源码目录下执行 make vmlinux 生成,或从 debuginfo 包安装)。

  • 检查 vmcore 是否完整:file vmcore 应显示 “Linux kernel core dump”
  • 验证 vmlinux 可用:crash vmlinux vmcore -h 不报错即基本可用;若提示 “unrecognized file format”,说明 vmlinux 缺失调试段或版本不匹配
  • 确保 crash 版本与内核主版本兼容(如 5.x 内核建议用 crash 7.3+)

快速定位 panic 触发点

启动 crash 后,第一件事是看 panic 日志和当前 CPU 状态:

  • log:查看内核环缓冲区,找 “Kernel panic”、“Oops”、“BUG” 或 “WARNING” 行,注意紧邻的调用痕迹(如 “Call Trace:” 后面的地址)
  • sys:确认崩溃时哪个 CPU 在运行(crashing_cpu 字段)、是否启用了 kdump、panic 发生时间等
  • mach:查看机器架构和内存布局,辅助判断地址有效性

提取关键调用栈(重点操作)

调用栈是分析根因的主线。crash 提供多个命令还原不同视角的栈:

Shakespeare
Shakespeare

一款人工智能文案软件,能够创建几乎任何类型的文案。

下载
  • bt(backtrace):显示当前上下文(通常是 panic 时正在执行的进程)的完整调用栈。加 -v 显示寄存器值,加 -a 显示所有 CPU 的栈(适合多核 panic 场景)
  • bt -f:强制解码栈帧,对被优化掉帧指针的内核(如 CONFIG_FRAME_POINTER=n)更可靠
  • ps | grep RUN:找出处于运行态的进程,再用 bt 查看其栈,常用于判断是否是某进程触发了资源耗尽或非法访问
  • 若栈中出现大量 ??:? 或无法解析的地址,说明对应模块未加载符号(如第三方驱动),需补充该模块的 .ko 文件并用 mod -s 加载符号

结合寄存器和内存缩小根因范围

调用栈只是“路径”,真正的问题常藏在寄存器值或异常内存访问中:

  • reg:查看崩溃 CPU 的寄存器快照,重点关注 rip(指令指针)、rsp(栈指针)、rbp(帧指针)、rax/rbx 等通用寄存器值。若 rip 指向非法地址(如 0x0000000000000000 或 0xffff88...),大概率是空指针解引用
  • dis -l
    :反汇编指定地址附近指令,确认崩溃前执行了哪条语句(如 mov %rax,(%rbx)rbx=0 即写空地址)
  • rd -8
    :读取内存内容,验证指针指向的数据是否合理(如检查 task_struct 中的成员是否为全 0 或野值)

不复杂但容易忽略:crash 中的地址默认是虚拟地址,所有命令(bt/dis/rd)都基于内核地址空间解析,无需手动转换。关键在于选对上下文(CPU/进程)和用对符号文件。

相关专题

更多
format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

619

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

431

2024.06.27

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

392

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

22

2025.11.16

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1349

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

703

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.4万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号