熟悉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命令
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 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 辅助命令
---------------------
作者:天弓(tg)
来源:CSDN
原文:https://blog.csdn.net/softgmx/article/details/79404747
版权声明:本文为博主原创文章,转载请附上博文链接!