| 2008 年 12 月 24 日 kdb 是專(zhuān)門(mén)用于執行系統轉儲映像分析的實(shí)用工具。本文將將介紹系統轉儲分析的基本步驟。 對于基本的轉儲分析,本文主要解釋轉儲映像。我們將介紹如何從 snap 包中提取相應的文件,接著(zhù)介紹一種檢查轉儲的系統方法,然后探查引起系統崩潰的根本原因。轉儲文件和 UNIX ? 文件位于 snap 包的 dump 子目錄中。 雖然我們考察的重點(diǎn)是轉儲映像,但是適當地使用 snap 選項還可以獲得有用的信息,這點(diǎn)很重要。更多信息請閱讀本文的 General 和 Kernel 小節。 general 目錄包括有關(guān)系統運行時(shí)環(huán)境的信息,例如:
kernel 子目錄包含了有用的內核信息(進(jìn)程和內存數據)。
使用 pax 命令從 snap 包中提取文件。
kdb 實(shí)用工具檢查當前運行系統的操作系統映像,并且與 IBM? AIX? 內核緊密耦合。這是因為它要求使用內核的結構信息來(lái)準確地格式化系統轉儲映像中包含的信息。kdb 為查看和格式化數據結構提供了大量子命令。
kdb 是一個(gè)交互式內核調試器。kdb 允許用戶(hù)控制內核代碼的執行(包括內核擴展和設備驅動(dòng)器),并觀(guān)察和修改變量和寄存器。它必須由一個(gè)特殊的啟動(dòng)映像調用。 kdb 是一個(gè)分析系統轉儲的工具/命令。它用于對系統轉儲進(jìn)行事后分析,或用于監視運行中的內核。 kdb 在檢查系統轉儲時(shí)通過(guò)兩個(gè)參數調用。第一個(gè)參數指定系統映像,而第二個(gè)參數指定轉儲期間系統運行的內核的 UNIX 文件。UNIX 文件必須匹配轉儲映像(比如,發(fā)生崩潰時(shí)正在運行的映像)。如果不匹配的話(huà),kdb 將顯示一個(gè)錯誤消息并退出。
如果沒(méi)有使用參數調用,kdb 將檢查當前正在運行的系統的映像。
對轉儲映像調用 kdb 之后,首先使用 stat 子命令檢索基本轉儲狀態(tài): 圖 1. Stat 輸出 ![]() kdb 的 stat 子命令提供了正在查看的轉儲的信息。除了包含日期、時(shí)間、版本和發(fā)布信息外,還包含轉儲原因代碼。 如果由于系統檢測到問(wèn)題而發(fā)起轉儲,那么 stat 子命令的輸出將包含標題為 CRASH INFORMATION 的部分。
這意味著(zhù)轉儲原因代碼為 300,即 DSI(DATA STORAGE INTERRUPT)。 轉儲原因代碼表示造成崩潰的基本原因。大多數崩潰通常顯示的原因代碼為 300、400 和 700。
kdb 永遠在運行崩潰線(xiàn)程的 CPU 上下文中啟動(dòng)。當調用 kdb 時(shí),顯示以下提示: 然而,要切換到另一個(gè) CPU 上下文,可以使用 cpu 子命令:
Machine State save area(MST)包含已保存的 CPU 進(jìn)程上下文的映像。進(jìn)程上下文包含通用寄存器、浮點(diǎn)寄存器、特殊用途的寄存器和其他有關(guān)重啟線(xiàn)程所需的信息。CPU 上的每個(gè)處理器都擁有自己的 CSA(當前保存區)指針,指向當線(xiàn)程或中斷處理程序由于上下文切換而被中斷或交換時(shí)使用的 MST。雖然線(xiàn)程是活動(dòng)的,但是運行線(xiàn)程的處理器的 CSA 將指向當前活動(dòng)線(xiàn)程的 MST。
圖 3. mst 子命令在 64 位內核中的輸出 ![]() 圖 4. mst 子命令在 32 位內核中的輸出 ![]()
prev 和 intpri 字段中的值幫助判斷處理器是在運行線(xiàn)程還是在運行中斷處理程序。 如果 CPU 正在運行一個(gè)線(xiàn)程,該線(xiàn)程可以位于處理上下文或中斷上下文中。中斷處理程序始終在中斷上下文中運行。 圖 5. 處理-中斷上下文 ![]() 處理環(huán)境與中斷環(huán)境之間的主要差別是:當處于中斷環(huán)境中時(shí),不允許出現任何頁(yè)面錯誤。 每個(gè) CPU 都有自己的 MSR,它表示處理器的狀態(tài)。 dr msr /* dr cmd 用于轉儲任何寄存器 */ 的內容
圖 6. MST 寄存器 ![]() 在討論系統轉儲時(shí),我們只關(guān)注在 CPU 中運行的引起系統崩潰的東西。 如果在 MSR 中設置了 PR 位(問(wèn)題狀態(tài)),那么 CPU 在用戶(hù)模式下運行,并且不可能引起系統崩潰。因為用戶(hù)模式指令沒(méi)有引起系統崩潰的足夠權限。 如果轉儲原因代碼為 300 或 400,我們必須對異常結構進(jìn)行分析。 圖 7. 異常結構 ![]()
我們必須對 mst 輸出中的值進(jìn)行分析。特別要檢查 IAR 引用的指令,證實(shí)它引起的崩潰類(lèi)型是 stat 子命令報告的類(lèi)型。 圖 9. Vmlog 輸出 ![]() 在 VMM 提供崩潰原因時(shí),vmlog 子命令提供額外的信息。代碼 300 轉儲中顯示的 Error ID 是 DSI_PROC,而在代碼 400 轉儲中為 ISI_PROC。Exception DSISR/ISISR,srval,virt addr 包含異常結構中顯示的信息。Exception 值是一個(gè)內部 VMM 錯誤代碼。 棧跟蹤
它顯示線(xiàn)程的內核模式棧跟蹤。 如果沒(méi)有提供任何參數,則顯示當前 CPU 上下文的棧跟蹤。 圖 10. 跟蹤輸出 ![]() 圖 11. DSI 示例 ![]() 上圖顯示了 stat 命令的輸出。輸出顯示錯誤代碼為 300,表明這是一個(gè) DSI 崩潰。 圖 12. DSI 跟蹤 ![]() 上圖顯示的棧跟蹤描述了當 CPU 0 上的某個(gè)線(xiàn)程運行 function __memmove 時(shí)出現的問(wèn)題。 圖 13. mst 命令輸出 ![]() mst 子命令的輸出表示線(xiàn)程(表示為 prev =0)在啟用了所有中斷的情況下運行(表示為 intpri =0B)。換句話(huà)說(shuō),線(xiàn)程正在進(jìn)程環(huán)境中運行。 異常結構的 dsisr 字段由兩項組成,DSISR_PROT 和 DSISR_ST。DSISR_PROT 字段表示出現保護違反(protection violation)。DSISR_ST 表示問(wèn)題與存儲操作有關(guān)。引起頁(yè)面錯誤的數據地址為 0x00(dar 0000000000000000)。 異常結構 dsisr 字段的 DSISR_ST 表示存儲操作出了問(wèn)題。我們希望 IAR 引用某種形式的存儲指令。
r7 的當前內容將被存儲到內存地址中(向 r3 的當前值加 0x08 得出該地址)。從 mst 子命令的輸出可以看到,r3 的當前值是 FFFFFFFFFFFFFFF8,因此向 FFFFFFFFFFFFFFF8 加 0x08 將得到:
這意味著(zhù) r7 的當前內容將被保存到地址 0X00。它匹配異常結構中 dar 字段顯示的值。 內核地址空間中的第一頁(yè)虛擬內存可通過(guò)內核代碼訪(fǎng)問(wèn),但是被標記為只讀。任何對該內存范圍執行寫(xiě)操作的嘗試將導致保護違反。
在使用 asterix (*) 調用 proc 子命令時(shí),它將以一行摘要顯示進(jìn)程表中的所有活動(dòng)進(jìn)程。 當使用進(jìn)程表地址或 slot 編號調用 proc 子命令時(shí),它將詳細顯示指定地址或 slot 的格式化進(jìn)程信息(如果在未使用參數的情況下調用 proc 子命令,它將詳細顯示當前進(jìn)程的格式化進(jìn)程信息)。 圖 14. proc 命令輸出 ![]() 圖 15. pid 輸出 ![]() 當使用 asterix (*) 調用 thread 子命令時(shí),它將以一行摘要顯示線(xiàn)程表中的所有活動(dòng)線(xiàn)程。 當使用線(xiàn)程表地址或 slot 編號調用 thread 子命令時(shí),它將詳細顯示指定線(xiàn)程的格式化線(xiàn)程信息(如果在未使用參數的情況下調用 thread 子命令,它將詳細顯示當前線(xiàn)程的格式化線(xiàn)程信息)。 圖 16. thread 命令輸出 ![]() 圖 17. tid 輸出 ![]() status 子命令列出了所有 CPU 的當前線(xiàn)程和進(jìn)程的信息。 ![]()
日志級別可設為 0、1 或 2。這決定將哪種信息記錄到日志文件中。值 0 表示禁止記錄到日志文件中。值 1 表示只記錄在提示時(shí)輸入的 kdb 命令。值 2 記錄 kdb 會(huì )話(huà)的輸入和輸出。
查找系統崩潰的根本原因是一個(gè)單調乏味的過(guò)程,因此了解 kdb 非常有用,它供一種分析系統崩潰的系統方法。通過(guò) kdb,您將能夠迅速跟蹤導致系統崩潰問(wèn)題。此外,您還學(xué)習到一種很有價(jià)值技能,借助它不僅能夠節省大量調試時(shí)間,還可以了解可以避免系統崩潰的編程實(shí)踐。最后這點(diǎn)也很重要,這是一種可以快速解決崩潰問(wèn)題的系統性方法,它將幫助您贏(yíng)得客戶(hù)信任。 |
聯(lián)系客服