熟悉windows的朋友都知道系统如果出现蓝屏了,会使用windbg工具来分析coredump文件,那么linux呢?linux主流解决方案是kdump+crash, kdump用来在系统crash的时候生成core dump文件,而crash工具就是用来分析这个core dump文件的。
- 系统环境
centos 7.2
- crash工具介绍
crash是一个用于交互式地分析正在运行的Linux系统或者kernel crash后的core dump数据的工具。
官方资料:
http://people.redhat.com/anderson/crash_whitepaper/
http://people.redhat.com/anderson/help.html
- 准备环境
# debuginfo-install kernel
# rpm -qa |grep kernel //查看是否安装成功
kernel-debuginfo-3.10.0-327.el7.x86_64
kernel-debuginfo-common-x86_64-3.10.0-327.el7.x86_64
查看内核所有模块的symbol文件的安装路径
# rpm -ql kernel-debuginfo-3.10.0-327.el7.x86_64
查看对应的内核源码安装路径
# rpm -ql kernel-debuginfo-common-x86_64-3.10.0-327.el7.x86_64
- 本地live调试
/usr/lib/debug/lib/modules/3.10.0-327.el7.x86_64/vmlinux
# crash /usr/lib/debug/lib/modules/3.10.0-327.el7.x86_64/vmlinux
- 调试分析kernel dump文件
/var/crash/127.0.0.1-2017-12-27-16:12:03/vmcore
#crash /var/crash/127.0.0.1-2017-12-27-16:12:03/vmcore /usr/lib/debug/lib/modules/3.10.0-327.el7.x86_64/vmlinux
- Crash 常用命令总结
命令 |
命令功能描述 |
struct |
以指定的结构体来格式化显示内存数据 |
union |
以指定的联合体来格式化显示内存数据 |
* |
替代struct和union命令,因为不去判断数据是struct还是union类型,直接用这个命令让crash自己判断 |
p |
就是gdb的print,用来打印内核变量 |
whatis |
通过指定的结构体名称、联合体名称、typedef重定义的名称以及带有语法信息的变量,找到其对应的类型定义 |
sym |
用来做内存地址到符号或符号到内存地址的转译 |
dis |
用来反汇编指定内核函数或一段内存 如反汇编一段用户空间代码: dis -u 7f6296b79000+0x3004 22 |
表1-1 用我们可以理解的格式查看指定内存地址数据
bt |
显示当前会话的调用栈 |
dev |
查看字符、块设备io端口和内存映射 |
files |
当前进程打开的所有文件 |
fuser |
反向查看一个文件目前被哪些进程打开 |
irq |
查看中断相关 |
kmem |
查看内存slab或内存统计等 |
log |
相当于dmesg命令 |
mach |
cpu相关 |
mod |
内核模块信息以及加载模块对应的symbol |
mount |
查看挂载文件系统的相关结构体数据 |
net |
能够找到进程打开的socket,也能引用指定socket的进程,进程的网络名字空间 |
ps |
进程相关 |
pte |
表页相关,查看页表项 |
runq |
系统负载 |
waitq |
处于等待的进程 |
sig |
异常事件处理相关 |
swap |
Swap设备相关信息 |
sys |
查看系统调用表里的信息 |
task |
查看task数据结构 |
timer |
显示timer队列中的信息 |
vm |
看一个进程的虚拟内存布局 |
vtop |
虚拟地址转换为物理地址 |
表1-2 查看系统状态
命令 |
命令功能描述 |
alias |
里面有些快捷命令 |
foreach |
前缀每一个进程或cpu都轮询一次 |
gdb |
执行gdb中的命令 |
repeat |
重复执行后面的命令 |
set |
设置当前默认进程环境 如切换当前进程: crash>set 35454 crash>set |
q/exit |
退出crash |
extend |
加入扩展模块 |
表1-3 进程环境相关命令
命令 |
命令功能描述 |
ascii |
把数字转换成ascii |
btop/ptob/ptov |
物理内存与虚拟地址转换 |
eval |
一个简单计算器 |
search |
重复执行后面的命令 |
rd |
显示一块内存,如: crash> rd -8 0xffffffffa0669000 100 ffffffffa0669000: 0f 1f 44 00 00 83 e6 f1 55 83 fe 01 19 c0 48 89 ..D.....U.....H. ffffffffa0669010: e5 f7 d0 83 e0 ea 5d c3 0f 1f 84 00 00 00 00 00 ......]......... ffffffffa0669020: 0f 1f 44 00 00 55 48 8b 81 68 04 00 00 8b 7f 2c ..D..UH..h....., ffffffffa0669030: 48 89 e5 4c 8b 80 40 09 00 00 e8 51 e0 fc ff 5d [email protected]...] ffffffffa0669040: c3 0f 1f 44 00 00 66 2e 0f 1f 84 00 00 00 00 00 ...D..f......... ffffffffa0669050: 0f 1f 44 00 00 55 48 8b 82 68 04 00 00 8b 7f 2c ..D..UH..h....., ffffffffa0669060: 48 89 e5 4c |
wd |
写一块内存 |