crash
简介
Analyze Linux crash dump data or a live system
如何安装 crash?
安装本机架构(如:x86)crash,直接通过 $ sudo apt install crash
安装即可。
安装非本机架构(如:arm64)crash,下载 crash 仓库源码, 执行 $ make target=ARM64
编译源码,即可生成 arm64 crash 可执行文件。
如何生成 vmcore?
在 Linux Kernel Panic 时自动生成 vmcore,不需要任何操作
在用户空间手动触发生成 vmcore
$ echo c > /proc/sysrq-trigger
通过 QEMU 手动触发生成 vmcore
## 启动 QEMU 后,按 Ctrl A+C 进入 QEMU monitor
(qemu) dump-guest-memory -p vmcore
如何使用 crash?
$ crash vmlinux vmcore
vmlinux 是在编译 Linux Kernel 后生成。
vmcore 是通过 netdump, diskdump, LKCD kdump, xendump kvmdump or VMware 生成。
如果调试在线系统,直接执行 $ crash vmlinux
即可。
crash 调试命令
crash> bt ## 显示 kernel-stack backtrace.
crash> dis -l [address] ## 显示 address 对应的源码位置和汇编指令
crash> dis -lr [address] ## 显示从函数开头到 address 的源码位置和汇编指令
crash> struct struct_name [address] -x ## 查看 address 对应的结构体内容
crash> struct struct_name[.member] -ox ## 查看结构体成员 member 的偏移
crash> rd [address] [count] ## 从 address 读取 count 个数据,单位 8Bytes
技巧
通过 log
查找 linux kernel panic 现场的第一行能够知道简单 panic 原因,再通过 ESR 知道更加详细的 panic 原因。
通过 log
查找 linux kernel panic pc 指针,使用 dis pc_address
显示 address 对应的汇编指令,其汇编指令对应的寄存器值都可以通过 log
的 linux kernel panic 现场得到,到这里就能够理解此指令 panic 的真正原因。再通过 dis -r pc_address
显示从函数开头到 address 的汇编指令,向上跟踪不正常寄存器值的源头。
通过 log
查找 sp 指针,使用 rd sp_address count
显示 stack 内容,从而推导 得到函数调用关系、每一个函数的参数/局部变量等。(需要熟悉 x86_64/arm64 的汇编指令、 函数进出栈原理)
Last updated
Was this helpful?