內核工程師必備工具--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   輔助命令
發佈了27 篇原創文章 · 獲贊 1 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章