您的位置:首页 > 其它

内核工程师必备工具--crash

2018-02-28 20:08 197 查看
        熟悉windows的朋友都知道系统如果出现蓝屏了,会使用windbg工具来分析coredump文件,那么linux呢?linux主流解决方案是kdump+crash, kdump用来在系统crash的时候生成core dump文件,而crash工具就是用来分析这个core dump文件的。

系统环境
       centos 7.2
crash工具介绍
什么是crash?
crash是一个用于交互式地分析正在运行的Linux系统或者kernel crash后的core dump数据的工具。
官方资料:
http://people.redhat.com/anderson/crash_whitepaper/
http://people.redhat.com/anderson/help.html

准备环境
安装 kernel debuginfo 内核符号文件
#  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调试
# rpm -ql kernel-debuginfo-3.10.0-327.el7.x86_64 |grep vmlinux
       /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文件
# find /var/crash -name "vmcore"
     /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命令
machcpu相关
mod内核模块信息以及加载模块对应的symbol
mount查看挂载文件系统的相关结构体数据
net能够找到进程打开的socket,也能引用指定socket的进程,进程的网络名字空间
ps进程相关
pte 表页相关,查看页表项
runq 系统负载
waitq 处于等待的进程
sig异常事件处理相关
swapSwap设备相关信息
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   H..L..@....Q...] 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写一块内存
                                                                       表1-4   辅助命令
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: