小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

使用 Crash 工具分析 Linux dump 文件

 老匹夫 2014-02-06

前言

Linux 內核(以下簡稱內核)是一個不與特定進程相關的功能集合,內核的代碼很難輕易的在調試器中執(zhí)行和跟蹤。開發(fā)者認為,內核如果發(fā)生了錯誤,就不應該繼續(xù)運行。因此內核發(fā)生錯誤時,它的行為通常被設定為系統(tǒng)崩潰,機器重啟?;趧討B(tài)存儲器的電氣特性,機器重啟后,上次錯誤發(fā)生時的現場會遭到破壞,這使得查找內核的錯誤變得異常困難。

內核社區(qū)和一些商業(yè)公司為此開發(fā)了很多種調試技術和工具,希望可以讓內核的調試變得簡單。其中一種是單步跟蹤調試方法,即使用代碼調試器,一步步的跟蹤執(zhí)行的代碼,通過查看變量和寄存器的值來分析錯誤發(fā)生的原因。這一類的調試器有 gdb,kdb, kgdb。另一種方法是在系統(tǒng)崩潰時,將內存保存起來,供事后進行分析。多數情況下,單步調式跟蹤可以滿足需求,但是單步跟蹤調試也有缺點。如遇到如下幾種情況時:

  • 錯誤發(fā)生在客戶的機器上。
  • 錯誤發(fā)生在很關鍵的生產機器上。
  • 錯誤很難重現。

單步調試跟蹤方法將無能為力。對于這幾種情況,在內核發(fā)生錯誤并崩潰的時候,將內存轉儲起來供事后分析就顯得尤為重要。本文接下來將介紹內核的內存轉儲機制以及如何對其進行分析。

回頁首

內核的內存轉儲機制

由于 Linux 的開放性的緣故,在 Linux 下有好幾種內存轉儲機制。下面將對它們分別做簡要的介紹。

LKCD

LKCD(Linux Kernel Crash Dump) 是 Linux 下第一個內核崩潰內存轉儲項目,它最初由 SGI 的工程師開發(fā)和維護。它提供了一種可靠的方法來發(fā)現、保存和檢查系統(tǒng)的崩潰。LKCD 作為 Linux 內核的一個補丁,它一直以來都沒有被接收進入內核的主線。目前該項目已經完全停止開發(fā)。

Diskdump

Diskdump 是另外一個內核崩潰內存轉儲的內核補丁,它由塔高 (Takao Indoh) 在 2004 年開發(fā)出來。與 LKCD 相比,Diskdump 更加簡單。當系統(tǒng)崩潰時,Diskdump 對系統(tǒng)有完全的控制。為避免混亂,它首先關閉所有的中斷;在 SMP 系統(tǒng)上,它還會把其他的 CPU 停掉。然后它校驗它自己的代碼,如果代碼與初始化時不一樣。它會認為它已經被破壞,并拒絕繼續(xù)運行。然后 Diskdump 選擇一個位置來存放內存轉儲。Diskdump 作為一個內核的補丁,也沒有被接收進入內核的主線。在眾多的發(fā)行版中,它也只得到了 RedHat 的支持。

Netdump

RedHat 在它的 Linux 高級服務器 2.1 的版本中,提供了它自己的第一個內核崩潰內存轉儲機制:Netdump。 與 LKCD 和 Diskdump 將內存轉儲保存在本地磁盤不同,當系統(tǒng)崩潰時,Netdump 將內存轉儲文件通過網絡保存到遠程機器中。RedHat 認為采用網絡方式比采用磁盤保的方式要簡單,因為當系統(tǒng)崩潰時,可以在沒有中斷的情況下使用網卡的論詢模式來進行網絡數據傳送。同時,網絡方式對內存轉儲文件提供了更好的管理支持。與 Diskdump 一樣,Netdump 沒有被接收進入內核的主線,目前也只有 RedHat 的發(fā)行版對 Netdump 提供支持。

Kdump

Kdump 是一種基于 kexec 的內存轉儲工具,目前它已經被內核主線接收,成為了內核的一部分,它也由此獲得了絕大多數 Linux 發(fā)行版的支持。與傳統(tǒng)的內存轉儲機制不同不同,基于 Kdump 的系統(tǒng)工作的時候需要兩個內核,一個稱為系統(tǒng)內核,即系統(tǒng)正常工作時運行的內核;另外一個稱為捕獲內核,即正常內核崩潰時,用來進行內存轉儲的內核。 在本文稍后的內容中,將會介紹如何設置 kump。

MKdump

MKdump(mini kernel dump) 是 NTT 數據和 VA Linux 開發(fā)另一個內核內存轉儲工具,它與 Kdump 類似,都是基于 kexec,都需要使用兩個內核來工作。其中一個是系統(tǒng)內核;另外一個是 mini 內核,用來進行內存轉儲。與 Kdump 相比,它有以下特點:

  • 將內存保存到磁盤。
  • 可以將內存轉儲鏡像轉換到 lcrash 支持格式。
  • 通過 kexec 啟動時,mini 內核覆蓋第一個內核。

回頁首

各種內存轉儲分析工具

與具有眾多的內存轉儲機制一樣,Linux 下也有眾多的內存轉儲分析工具,下面將會逐一做簡單介紹。

Lcrash

Lcrash 是隨 LKCD 一起發(fā)布的一個內內存儲分析工具。隨著 LKCD 開發(fā)的停止,lcrash 的開發(fā)也同時停止了。目前它的代碼已經被合并進入 Crash 工具中。

Alicia

Alicia (Advanced Linux Crash-dump Interactive Analyzer,高級 Linux 崩潰內存轉儲交互分析器 ) 是一個建立在 lcrash 和 Crash 工具之上的一個內存轉儲分析工具。它使用 Perl 語言封裝了 Lcrash 和 Crash 的底層命令,向用戶提供了一個更加友好的交互方式和界面。Alicia 目前的開發(fā)也已經停滯。

Crash

Crash 是由 Dave Anderson 開發(fā)和維護的一個內存轉儲分析工具,目前它的最新版本是 5.0.0。 在沒有統(tǒng)一標準的內存轉儲文件的格式的情況下,Crash 工具支持眾多的內存轉儲文件格式,包括:

  • Live linux 系統(tǒng)
  • kdump 產生的正常的和壓縮的內存轉儲文件
  • 由 makedumpfile 命令生成的壓縮的內存轉儲文件
  • 由 Netdump 生成的內存轉儲文件
  • 由 Diskdump 生成的內存轉儲文件
  • 由 Kdump 生成的 Xen 的內存轉儲文件
  • IBM 的 390/390x 的內存轉儲文件
  • LKCD 生成的內存轉儲文件
  • Mcore 生成的內存轉儲文件

回頁首

使用 Crash 分析內存轉儲文件的例子

通過前面的學習,你現在可能已經躍躍欲試了。本文接下來的部分,將以 kdump 為例子,向大家演示如何設置系統(tǒng)、如何產生內存轉儲文件以及如何對內存轉儲文件進行分析。

kdump 的安裝設置

如前面所述,支持 kdump 的系統(tǒng)使用兩個內核進行工作。目前一些發(fā)行版,如 RedHat 和 SUSE 的 Linux 都已經編譯并設置好這兩個內核。如果你使用其他發(fā)行版的 Linux 或者想自己編譯內核支持 kdump,那么可以根據如下介紹進行。

安裝 kexec

  1. 使用 root 用戶登錄系統(tǒng)。
  2. 使用 wget 從 Internet 上下載 kexec。
    wget http://www./pub/linux/kernel/people/horms/kexec-tools/ kexec-tools.tar.gz
  3. 解壓并安裝 kexec 到系統(tǒng)中。
     # tar xvpzf kexec-tools.tar.gz 
     # cd kexec-tools-VERSION 
     # ./configure 
     # make && make install

配置系統(tǒng)內核和捕捉內核都需要的內核選項:

  • 在 "Processor type and features."選項中啟用"kexec system call"。
     CONFIG_KEXEC=y
  • 在"Filesystem" -> "Pseudo filesystems." 中啟用"sysfs file system support"。
     CONFIG_SYSFS=y
  • 在"Kernel hacking."中啟用"Compile the kernel with debug info"。
     CONFIG_DEBUG_INFO=Y

配置捕捉內核的與架構無關的選項:

  • 在"Processor type and features"中啟用"kernel crash dumps"。
     CONFIG_CRASH_DUMP=y
  • 在"Filesystems" -> "Pseudo filesystems"中啟用"/proc/vmcore support"。
     CONFIG_PROC_VMCORE=y

配置捕捉內核的與架構相關的選項:

Linux 內核支持多種 CPU 架構,這里只介紹捕捉內核在 i386 下的配置

  • 在"Processor type and features"中啟用高端內存支持。
     CONFIG_HIGHMEM64G=y
  • 在"Processor type and features"中關閉多處理器支持。
     CONFIG_SMP=n
  • 在"Processor type and features"中啟用"Build a relocatable kernel"。
     CONFIG_RELOCATABLE=y
  • 在"Processor type and features"->"Physical address where the kernel is loaded"中,為內核設置一個加載起始地址。在大多數的機器上,16M 是一個合適的值。
     CONFIG_PHYSICAL_START=0x1000000

加載新的系統(tǒng)內核

  1. 編譯系統(tǒng)內核和捕捉內核。
  2. 將重新編譯好的內核添加到啟動引導中,注意不要將捕捉內核添加到啟動引導菜單中。
  3. 給系統(tǒng)內核添加啟動參數"crashkernel=Y@X",這里,Y 是為 dump 捕捉內核保留的內存,X 是保留部分內存的開始位置。在 i386 的機器上,設置"crashkernel=64M@16M"。
  4. 重啟機器,在啟動菜單中選擇新添加的啟動項,啟動新的系統(tǒng)內核。

加載捕捉內核

在系統(tǒng)內核引導完成后,需要將捕捉內核加載到內存中。使用 kexec 工具將捕捉內核加載到內存:

 # kexec -p <dump-capture-kernel-bzImage> \ 
  --initrd=<initrd-for-dump-capture-kernel> \ 
  --append="root=<root-dev> <arch-specific-options>"

觸發(fā)內核崩潰

在捕捉內核被加載進入內存后,如果系統(tǒng)崩潰開關被觸發(fā),則系統(tǒng)會自動切換進入捕捉內核。觸發(fā)系統(tǒng)崩潰的開關有 panic(),die(),die_nmi() 內核函數和 sysrq 觸發(fā)事件,可以使用其中任意的一個來觸發(fā)內核崩潰。不過,在讓內核崩潰之前,我們還需要做一些安裝設置。

Crash 工具的安裝設置

Crash 目前的最新的版本是 5.0.0, 你可以從它的官方網站下載最新的版本。下載完成后對其進行解壓安裝。

 # tar -zvxf crash-5.0.0.tar.gz 
 # cd crash-5.0.0 
 # ./configure 
 # make &&make install

生成內存轉儲文件

現在已經設置好 Kdump 和 crash,現在可以使用前面介紹的系統(tǒng)崩潰開關中的任意一個來引發(fā)系統(tǒng)崩潰來生成一個內存轉儲文件,并可以使用 crash 對其進行分析。

首先,觸發(fā)系統(tǒng)崩潰,這里使用 sysrq 觸發(fā)事件。

 # echo c > /proc/sysrq-trigger

緊接著,系統(tǒng)會自動啟動捕捉內核。待完全啟動進入捕捉內核后,通過以下命令保存內存轉儲文件。

 # cp /proc/vmcore mydumpfile

將在當前目錄生成一個 mydumpfile 文件。

分析內存轉儲文件

現在有了一個內存轉儲文件,接下來使用 crash 對其進行分析

 # crash vmlinux mydumpfile

這里 vmlinux 是帶調試信息的內核。如果一切正常,將會進入到 crash 中,如圖 1 所示。

圖 1. crash 命令提示符
圖片示例

在該提示符下,可以執(zhí)行 crash 的內部命令。通過 crash 的內部命令,可以查看寄存器的值、函數的調用堆棧等信息。在圖 2 中,顯示了執(zhí)行 bt命令后得到的函數調用的堆棧信息。

圖 2. 函數調用堆棧信息
圖片示例

crash 使用 gdb 作為它的內部引擎,crash 中的很多命令和語法都與 gdb 相同。如果你曾經使用過 gdb,就會發(fā)現 crash 并不是很陌生。如果想獲得 crash 更多的命令和相關命令的詳細說明,可以使用 crash 的內部命令 help來獲取。

回頁首

后記

本文介紹了 Linux 下的各種內存轉儲機制,以及如何 crash 工具開對內存轉儲文件進行分析。內核雖然復雜,但通過結合使用內核的內存轉儲文件和 crash 分析工具,可以輕松的找到內核問題的所在。通過對這篇文章的學習,相信你也可以像一個專業(yè)的內核開發(fā)者那樣去追蹤和修復內核的錯誤了。

參考資料

學習

  • 參考 developerWorks 中國 首頁查看 IBM 軟件和開放技術的最新信息。
  • 參考 LKCD 主頁了解關于 LKCD 的信息。
  • 參考 Diskdump 的討論查看關于 Diskdump 的介紹。
  • 參考 Crash 工具的主頁了解 crash 工具相關內容。
  • 參考 Alicia 的主頁了解 Alicia 分析工具。
  • 參考 Linux 內核源代碼下的 Documentation/kdump/kdump.txt 了解更多關于 Kdump 的信息。
  • 查看 Linux 內核源代碼下的 README 了解如何編譯內核。
  • 參考 kdump 的主頁獲取更多關于 kdump 和 kexec 的信息。
  • 參考 GDB 文檔獲取更多關于 gdb 的信息。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多