当前位置: 首页 > news >正文

Linux Crash工具全解:内核崩溃分析的一切

在下实环境下,Linux 内核崩溃是常见但极其糟难寻根问题的环节。而 crash 工具正是用于分析这类内核崩溃环境的精准利器。本文将从原理、实现、环境配置、实战案例等方面全面介绍 crash 工具,帮助学者精通 Linux 内核崩溃分析技术。

一、Crash 工具概念

1.1 是什么?

crash 是 Linux 官方提供的一种内核崩溃分析工具,其功能类似 gdb,但对进程和内核结构体有更好支持,支持操作 vmcore 内容。

1.2 工作原理

  • 在 Linux 内核崩溃时,通过 kexec/kdump 启动备用内核
  • 备用内核把原内核内存全量 dump 成 vmcore
  • crash 通过 vmlinux + vmcore 实现分析

1.3 主要功能

  • 分析内核崩溃堆栈
  • 显示内核进程状态
  • 检视内存、文件系统、虚拟内存分配
  • 查看设备、主机基本信息

在这里插入图片描述

二、Crash 分析需要的文件

2.1 vmlinux

包含了运行时符号、调试信息的完整内核镜像文件

路径示例:

tmp/work-shared/imx8mp/kernel-build-artifacts/vmlinux

2.2 vmcore

由内核崩溃后,kdump 备用内核生成的内存 dump 文件

默认位置:

/proc/vmcore
/var/crash/xxxx/vmcore

三、环境配置过程

3.1 内核配置

确保内核打开下列选项:

CONFIG_KEXEC=y
CONFIG_KEXEC_FILE=y
CONFIG_CRASH_DUMP=y
CONFIG_DEBUG_INFO=y

3.2 Yocto 实环:添加 kexec-tools

IMAGE_INSTALL:append = " kexec-tools "

3.3 U-Boot 启动参数添加 crashkernel

setenv extraargs 'crashkernel=256M'
setenv mmcargs 'setenv bootargs ${mcore_clk} console=${console} ${extraargs} root=${mmcroot}'
saveenv

重启后确认

dmesg | grep -i crash

3.4 手动装载备用内核

kexec -p /boot/Image --append="root=/dev/mmcblk2p2 console=ttymxc1,115200"

四、Crash 基本分析命令

命令功能说明
log查看崩溃时的内核日志
bt调用堆栈分析 (出错函数)
ps调用崩溃时进程列表
vm虚拟内存分配情况
kmem -i内核内存概况
files进程打开的文件描述符
sys系统基本信息

示例:

crash> log
crash> bt
crash> ps

五、实战案例:拟真崩溃分析

步骤概述

  1. 启动 kexec -p 备用内核
  2. 手动触发 panic:
echo c > /proc/sysrq-trigger
  1. 备用内核启动,生成 /proc/vmcore
  2. 将 vmcore 拆离到 Ubuntu 主机
  3. 分析
crash vmlinux vmcore

分析点示例

log → 看到 panic: NULL pointer dereference
bt  → 分析出 给了对象为 NULL 即调用了函数
ps  → 现场进程运行在 kworker/线程

六、常见问题和辩解

问题解决方案
crash: cannot find vmcore file确保崩溃后启动了 kexec -p 备用内核
crashkernel 设置后无效确认 U-Boot 传入 bootargs 正确
crash 分析中查不到 symbol确认使用了带 debug info 的 vmlinux
vmcore 太大无法移动使用 U 盘 / scp 拆离,或离线分析

七、学习推荐路线

  1. 读懂 crash 基本原理
  2. 配置成功 Yocto + kexec + crashkernel
  3. 重复触发 panic + vmcore 生成
  4. 掌握 crash 分析命令(bt、ps、log、kmem等)
  5. 分析实际高频崩溃问题

推荐阅读《https://crash-utility.github.io/》 官方文档


八、结论

crash 工具是 Linux 内核崩溃分析的重要工具,配合 Yocto 、kexec 、kdump 可实现一套完整的内核错误分析链路。从学习 crash 开始,可以深入了解 Linux 内核的运行结构和进程机制,是成为高级内核工程师的必由之路。

http://www.xdnf.cn/news/701317.html

相关文章:

  • shell脚本总结11
  • 华为OD机试真题——矩形绘制(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
  • 数据库表与实体类设计
  • 中望CAD与AutoCAD的SWOT对比分析(基于2025线上发布会观察与行业数据)
  • 阿里云云效对接SDK获取流水线制品
  • C++模板语法大全
  • Rust 的Hello World
  • 在qt中使用c++实现与Twincat3 PLC变量通信
  • 知行之桥如何将消息推送到钉钉群?
  • 前端面经 hook 获取dom元素
  • Cookie与Session简介-笔记
  • 代谢测定试剂盒_生化制剂_Sigma-Aldrich®实验室用品及生产材料
  • FastApi学习
  • AMBA-AHB的控制信号
  • jenkins部署slave动态节点
  • java 开发中 nps的内网穿透 再git 远程访问 以及第三放支付接口本地调试中的作用
  • 使用 find 遍历软链接目录时,为什么必须加 -L
  • 华为OD最新机试真题-按单词下标区间翻转文章内容-OD统一考试(B卷)
  • 【案例95】“小”问题引发的“大”发现---记一次环境修复
  • 十六进制数据转换为对应的字符串
  • Python 如何让自动驾驶的“眼睛”和“大脑”真正融合?——传感器数据融合的关键技术解析
  • Java+POI+EXCEL导出柱形图(多列和单列柱形图)
  • 外骨骼驾驶舱HOMIE——3500元让人形机器人1:1复刻人类动作:类似Mobile ALOHA主从臂的主从分离版
  • 深度学习入门:从零搭建你的第一个神经网络
  • Vue3对接deepseek实现ai对话
  • 系统性学习C语言-第十讲-操作符详讲
  • javascript中运算符的优先级
  • 如何把示例数据0.617、0.229、0.174保留两位小数,并在后面添加%处理,处理后的结果如下:61.7%、22.9%、17.4%
  • Java | 韩顺平 循序渐进学Java自用笔记---OOP高级(二)
  • Kaggle-基于xgboost的销量预测