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

        熟悉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   [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

写一块内存

                                                                       表1-4   辅助命令

猜你喜欢

转载自blog.csdn.net/softgmx/article/details/79404747