熟悉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 | 寫一塊內存 |