本文首先介紹了 crash 的基本概念和安裝方法,其次詳細介紹了如何使用 crash 工具分析內核崩潰轉儲文件,包括各種常用調試命令的使用方法,最後以幾個實際工作中遇到的真實案例向讀者展示了 crash 的強大功能。在這篇文章中,既有詳細的工具使用方法,又有豐富的實際案例分析,相信您讀過以後定會受益匪淺。
什麼是 crash
如前文所述,當 linux 系統內核發生崩潰的時候,可以通過 kdump 等方式收集內核崩潰之前的內存,生成一個轉儲文件 vmcore。內核開發者通過分析該 vmcore 文件就可以診斷出內核崩潰的原因,從而進行操作系統的代碼改進。那麼 crash 就是一個被廣泛使用的內核崩潰轉儲文件分析工具,掌握 crash 的使用技巧,對於定位問題有著十分重要的作用。
使用 crash 的先決條件
由於 crash 用於調試內核崩潰的轉儲文件,因此使用 crash 需要依賴如下條件:
1. kernel 映像文件 vmlinux 在編譯的時候必須指定了 -g 參數,即帶有調試信息。
2. 需要有一個內存崩潰轉儲文件(例如 vmcore),或者可以通過 /dev/mem 或 /dev/crash 訪問的實時系統內存。如果 crash 命令行沒有指定轉儲文件,則 crash 默認使用實時系統內存,這時需要 root 權限。
3. crash 支持的平台處理器包括:x86, x86_64, ia64, ppc64, arm, s390, s390x ( 也有部分 crash 版本支持 Alpha 和 32-bit PowerPC,但是對於這兩種平台的支持不保證長期維護 )。
4. crash 支持 2.2.5-15(含)以後的 Linux 內核版本。隨著 Linux 內核的更新,crash 也在不斷升級以適應新的內核。
crash 安裝指南
要想使用 crash 調試內核轉儲文件,需要安裝 crash 工具和內核調試信息包。不同的發行版安裝包名稱略有差異,這裡僅列出 RHEL 和 SLES 發行版對應的安裝包名稱如下:
表 1. crash 工具和內核調試包
以 RHEL 為例,安裝 crash 及內核調試信息包的步驟如下:
rpm -ivh crash-5.1.8-1.el6.ppc64.rpm
rpm -ivh kernel-debuginfo-common-ppc64-2.6.32-220.el6.ppc64.rpm
rpm -ivh kernel-debuginfo-2.6.32-220.el6.ppc64.rpm
啟動 crash
啟動參數說明
使用 crash 調試轉儲文件,需要在命令行輸入兩個參數:debug kernel 和 dump file,其中 dump file 是內核轉儲文件的名稱,debug kernel 是由內核調試信息包安裝的,不同的發行版名稱略有不同,以 RHEL 和 SLES 為例:
RHEL6.2:/usr/lib/debug/lib/modules/2.6.32-220.el6.ppc64/vmlinux
SLES11SP2:/usr/lib/debug/boot/vmlinux-3.0.13-0.27-ppc64.debug
使用 crash -h 或 man crash 可以查看 crash 支持的一系列選項,這裡僅以常用的選項為例說明如下:
-h:打印幫助信息
-d:設置調試級別
-S:使用 /boot/System.map 作為默認的映射文件
-s:不顯示版本、初始調試信息等,直接進入命令行
-i file:啟動之後自動運行 file 中的命令,再接受用戶輸入