linux crash tool
crash 是一个强大的 Linux 内核崩溃调试工具,常用于分析内核崩溃转储(vmcore 文件)或正在运行的内核。它是基于 GDB 的高级扩展,配合 kexec/kdump 机制可以深入查看崩溃时的内核状态,广泛用于服务器、嵌入式、数据中心内核问题定位。
crash 工具工作原理概览
- 基本组成
- vmcore:内核崩溃时生成的转储镜像文件,由
kdump生成。 - vmlinux:带符号表的内核可执行文件(不是
bzImage,不能压缩)。 - crash:GDB 扩展,提供丰富命令查看 vmcore 的状态。
crash运行方式
crash vmlinux vmcore
此命令加载内核调试符号和崩溃转储文件,进入交互式调试界面。
使用 crash 查看关键内核状态
常用命令一览:
| 命令 | 功能描述 |
|---|---|
help | 查看 crash 支持的命令 |
bt | 打印当前任务的调用栈 |
ps | 查看所有进程状态 |
log | 查看 dmesg 日志 |
vm | 查看虚拟内存使用情况 |
files | 显示进程打开的文件信息 |
kmem | 查看 slab 分配器的使用状态 |
runq | 显示运行队列 |
irq | 显示中断表 |
foreach TASK bt | 打印所有进程的调用栈 |
典型分析流程
- 收集内核转储(kdump)
编辑 /etc/kdump.conf,配置崩溃转储位置,然后启用服务:
systemctl enable kdump.service
systemctl start kdump.service
当系统 panic 时,kdump 会保存 /var/crash/<timestamp>/vmcore。
- 使用 crash 分析崩溃镜像
crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/crash/.../vmcore
进入 crash 命令行后:
log # 查看最后 dmesg,寻找 panic 原因
bt # 当前进程的调用栈
ps # 定位是哪个进程发生问题
files # 检查是否文件系统相关
深入分析场景
- 调用栈分析(bt)
> bt
PID: 1234 TASK: ffff888123456000 CPU: 1 COMMAND: "my_process"
#0 [ffff8880b3e079d8] machine_kexec at ffffffff8105e1d0
#1 [ffff8880b3e07a30] __crash_kexec at ffffffff810e319d
...
查明触发 crash 的函数链路。
- 分析 slab 内存泄漏(
kmem)
> kmem -s
CACHE NAME OBJSIZE ALLOCATED
ffff88812fa2a100 dentry 192 23421
ffff88812fa2b100 kmalloc-512 512 9999
...
配合 slabinfo 查看泄漏热点。
- 查看内核符号
sym irq_exit
type task_struct
可用于查看内核内部结构。
crash vs GDB
| 项目 | GDB | crash |
|---|---|---|
| 操作对象 | 用户态程序/内核符号 | 运行中内核或崩溃转储 vmcore |
| 功能 | 通用调试器 | 面向内核结构,命令更友好 |
| 调用栈查看 | 支持,但需手动查结构 | 内建 bt 命令支持所有任务 |
| 内存查看 | 支持 | rd, list, struct, kmem 等功能更强 |
crash 插件与拓展
extensions/目录下可以放入自定义模块(以.c实现__crash_extension_init__入口)- Python 脚本支持:较弱,
crash本身偏 C 插件开发
构建 crash 和 vmlinux 符号建议
确保使用与你分析的内核完全一致的 vmlinux(可通过 debuginfo 包安装):
dnf install kernel-debuginfo-$(uname -r)
示例:分析一次 Null Pointer Dereference
日志提示:
kernel NULL pointer dereference at 0x0
crash 分析:
crash vmlinux vmcore
> log
...
> bt
> struct task_struct ffff888123456000
> dis -l ffffffff810abcd0
可反推出发生崩溃的函数位置与参数状态。
Linux crash tool 分析与使用

被折叠的 条评论
为什么被折叠?



