欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
kdb 入門(mén)

2008 年 12 月 24 日

kdb 是專(zhuān)門(mén)用于執行系統轉儲映像分析的實(shí)用工具。本文將將介紹系統轉儲分析的基本步驟。

簡(jiǎn)介

對于基本的轉儲分析,本文主要解釋轉儲映像。我們將介紹如何從 snap 包中提取相應的文件,接著(zhù)介紹一種檢查轉儲的系統方法,然后探查引起系統崩潰的根本原因。轉儲文件和 UNIX ? 文件位于 snap 包的 dump 子目錄中。

雖然我們考察的重點(diǎn)是轉儲映像,但是適當地使用 snap 選項還可以獲得有用的信息,這點(diǎn)很重要。更多信息請閱讀本文的 GeneralKernel 小節。

General

general 目錄包括有關(guān)系統運行時(shí)環(huán)境的信息,例如:

  • ODM 數據拷貝。
  • 所有環(huán)境變量(例如 PATH 和 TZ)。
  • 數據收集的日期和時(shí)間。
  • 系統的實(shí)際內存量(bootinfo -r)。
  • 所有已定義頁(yè)面空間的列表。
  • 所有已安裝文件集及其級別的列表。
  • 所有已安裝 APAR 的列表。
  • 設備屬性(lsattr -El)。
  • 系統 VPD 信息(lscfg -pv)。
  • 上一次轉儲的狀態(tài)(sysdumpdev -L)。

Kernel

kernel 子目錄包含了有用的內核信息(進(jìn)程和內存數據)。

  • 數據收集的日期和時(shí)間。
  • vmstat 輸出。
  • VMM 可調信息(vmo -L)。
  • 調度可調信息(schedo -L)。
  • 與 I/O 有關(guān)的可調信息(ioo -L)。
  • 環(huán)境變量。
  • SRC 信息(lssrc -a)。
  • 進(jìn)程信息(ps -ef 和 ps -leaf)。
  • 設備驅動(dòng)器和方法的校驗和。




回頁(yè)首


提取 snap 包

使用 pax 命令從 snap 包中提取文件。

  • 要查看 snap 文件的內容,輸入以下命令:
    # zcat snap.pax.Z | pax -v

  • 要提取該包的所有內容,輸入以下命令:
     # zcat snap.pax.Z | pax -r

  • 要僅提取 dump、general 和 kernel 子目錄,輸入:
     #uncompress snap.pax.Z                            #zcat snap.pax.Z | pax -r ./dump ./general ./kernel





回頁(yè)首


kdb 是什么?

kdb 實(shí)用工具檢查當前運行系統的操作系統映像,并且與 IBM? AIX? 內核緊密耦合。這是因為它要求使用內核的結構信息來(lái)準確地格式化系統轉儲映像中包含的信息。kdb 為查看和格式化數據結構提供了大量子命令。





回頁(yè)首


KDB - 內核調試器

kdb 是一個(gè)交互式內核調試器。kdb 允許用戶(hù)控制內核代碼的執行(包括內核擴展和設備驅動(dòng)器),并觀(guān)察和修改變量和寄存器。它必須由一個(gè)特殊的啟動(dòng)映像調用。

kdb 是一個(gè)分析系統轉儲的工具/命令。它用于對系統轉儲進(jìn)行事后分析,或用于監視運行中的內核。

調用 kdb

kdb 在檢查系統轉儲時(shí)通過(guò)兩個(gè)參數調用。第一個(gè)參數指定系統映像,而第二個(gè)參數指定轉儲期間系統運行的內核的 UNIX 文件。UNIX 文件必須匹配轉儲映像(比如,發(fā)生崩潰時(shí)正在運行的映像)。如果不匹配的話(huà),kdb 將顯示一個(gè)錯誤消息并退出。

# kdb [dump] [unix]

如果沒(méi)有使用參數調用,kdb 將檢查當前正在運行的系統的映像。

# kdb

獲取轉儲狀態(tài)

對轉儲映像調用 kdb 之后,首先使用 stat 子命令檢索基本轉儲狀態(tài):


圖 1. Stat 輸出

kdb 的 stat 子命令提供了正在查看的轉儲的信息。除了包含日期、時(shí)間、版本和發(fā)布信息外,還包含轉儲原因代碼。

轉儲原因代碼

如果由于系統檢測到問(wèn)題而發(fā)起轉儲,那么 stat 子命令的輸出將包含標題為 CRASH INFORMATION 的部分。

  • 該部分中,輸出的第一行列出了檢測到問(wèn)題的 CPU,這些問(wèn)題造成轉儲例程被調用(在前面的示例中 CPU 為 0)。
  • 轉儲原因代碼指文本 “error code for LEDs” 旁邊顯示的數字的前三位。在前面的示例中,CRASH INFORMATION 部分的前三位包含以下文本:
    error code for LEDs: 30000000

這意味著(zhù)轉儲原因代碼為 300,即 DSI(DATA STORAGE INTERRUPT)。

轉儲原因代碼表示造成崩潰的基本原因。大多數崩潰通常顯示的原因代碼為 300、400 和 700。

原因代碼 說(shuō)明
2nn 機器檢查
3nn 數據存儲中斷
400 指令存儲中斷
5nn 外部中斷
700 程序中斷
800 浮點(diǎn)數據不可用

  • 2nn-機器檢查。

    機器檢查原因代碼通常表示硬件問(wèn)題(比如,內存損壞)。

  • 3nn-數據存儲中斷(DSI)。

    如果對當前不在物理內存中加載的虛擬地址進(jìn)行引用(這是一個(gè)頁(yè)面錯誤),則會(huì )出現 DSI 錯誤。頁(yè)面錯誤是經(jīng)常發(fā)生的錯誤。通常由 VMM 處理,并且不會(huì )導致系統崩潰。然而,如果頁(yè)面錯誤不能夠在內核模式下解決,或者在禁用中斷情況下出現頁(yè)面錯誤,那么 DIS 將造成系統崩潰。這個(gè)問(wèn)題通常由軟件引起,但是偶爾也和硬件有關(guān)。

  • 400-指令存儲中斷(ISI)。

    指令存儲中斷通常是指在取出指令時(shí)發(fā)生頁(yè)面錯誤。這種錯誤通常通過(guò) VMM 解決,并且一般不會(huì )造成系統崩潰。如果不能夠通過(guò) VMM 解決,或者在禁用中斷的情況下發(fā)生頁(yè)面錯誤,那么將造成系統崩潰。

  • 5nn-外部中斷。

    引起崩潰的原因是外部設備出現中斷,比如 I/O 總線(xiàn)控制器。

  • 700-程序中斷。

    這種類(lèi)型的中斷是由內核例程調用了 trap 指令引起的。這通常是調用 panic 內核服務(wù)或斷言失敗造成的。內核例程在遇到無(wú)法解決的問(wèn)題時(shí)就會(huì )調用 panic 服務(wù)。這種問(wèn)題通常和軟件有關(guān),但也可能和硬件也有關(guān)。

  • 800-浮點(diǎn)不可用。

    如果在 MSR(機器狀態(tài)寄存器)中可用的浮點(diǎn)位被禁用,將嘗試執行一個(gè)浮點(diǎn)指令。





回頁(yè)首


初始 CPU 上下文

kdb 永遠在運行崩潰線(xiàn)程的 CPU 上下文中啟動(dòng)。當調用 kdb 時(shí),顯示以下提示:(n)>>,其中的 n 表示當前的 CPU 上下文。

然而,要切換到另一個(gè) CPU 上下文,可以使用 cpu 子命令:

(0)>> cpu 1                        (1)>>                        

MST (MACHINE STATE SAVE AREA)

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。

  • MST 中的其中一個(gè)字段是指向前一個(gè) MST 的指針(kdb 中的上一個(gè) MST)。該字段只能在中斷上下文中被填充。

    圖 2. 表示中斷歷史的 MST 結構鏈


  • mst 子命令:
                                mst [ thread_slot | thread_table_address ]

    為指定的線(xiàn)程提供一個(gè)格式化的 MST 顯示。如果沒(méi)有指定任何地址,將顯示當前處理器的 MST 區域。


圖 3. mst 子命令在 64 位內核中的輸出


圖 4. mst 子命令在 32 位內核中的輸出

mst 子命令輸出中的數據字段

  • iar-指令地址寄存器。

    包含錯誤指令的位置(錯誤的 MST)。這是在崩潰期間執行的當前指令。

  • lr-鏈接寄存器的值。

    包含函數的返回地址。

  • Except-顯示異常結構。

    提供有關(guān)崩潰特征的信息。

  • r0-r31 顯示通用寄存器的內容。
  • intpri-表示中斷優(yōu)先級別。

    表示處理器是否在中斷禁用的情況下運行。

  • prev-值是否為 0。

    MST 表示處理器中運行的基本級別的線(xiàn)程。如果值為非 0 的值,則處理器正在處理中斷。prev 字段指向鏈中的下一個(gè) MST 結構。

prev 和 intpri 字段中的值幫助判斷處理器是在運行線(xiàn)程還是在運行中斷處理程序。

如果 CPU 正在運行一個(gè)線(xiàn)程,該線(xiàn)程可以位于處理上下文或中斷上下文中。中斷處理程序始終在中斷上下文中運行。


圖 5. 處理-中斷上下文

處理環(huán)境與中斷環(huán)境之間的主要差別是:當處于中斷環(huán)境中時(shí),不允許出現任何頁(yè)面錯誤。

Machine State Register (MSR)

每個(gè) CPU 都有自己的 MSR,它表示處理器的狀態(tài)。

dr msr /* dr cmd 用于轉儲任何寄存器 */ 的內容

    (0)> dr msr                        msr  : 0000F0B2   bit set : EE PR FP ME IR DR RI                        


圖 6. MST 寄存器

分析 MSR 數據

在討論系統轉儲時(shí),我們只關(guān)注在 CPU 中運行的引起系統崩潰的東西。

如果在 MSR 中設置了 PR 位(問(wèn)題狀態(tài)),那么 CPU 在用戶(hù)模式下運行,并且不可能引起系統崩潰。因為用戶(hù)模式指令沒(méi)有引起系統崩潰的足夠權限。

如果轉儲原因代碼為 300 或 400,我們必須對異常結構進(jìn)行分析。


圖 7. 異常結構

  • dar(數據地址寄存器)包含處理器嘗試訪(fǎng)問(wèn)的地址,這一行為將引發(fā)頁(yè)面錯誤。
  • dsisr(數據存儲中斷狀態(tài)寄存器)表示頁(yè)面錯誤無(wú)法解決的原因。

    圖 8. DSISR 位描述


  • dsirr(數據存儲中斷原因寄存器)表示發(fā)生的頁(yè)面錯誤的類(lèi)型。通過(guò)將十六進(jìn)制值轉換為十進(jìn)制值來(lái)對 dsirr 進(jìn)行解碼。

    1 到 127 之間的值是錯誤編碼(在 /usr/include/sys/errno.h 中顯示),而 128 到 512 之間的值屬于異常(在 /usr/include/sys/m_except.h 中顯示)。

我們必須對 mst 輸出中的值進(jìn)行分析。特別要檢查 IAR 引用的指令,證實(shí)它引起的崩潰類(lèi)型是 stat 子命令報告的類(lèi)型。

VMM 錯誤日志


圖 9. Vmlog 輸出

在 VMM 提供崩潰原因時(shí),vmlog 子命令提供額外的信息。代碼 300 轉儲中顯示的 Error ID 是 DSI_PROC,而在代碼 400 轉儲中為 ISI_PROC。Exception DSISR/ISISR,srval,virt addr 包含異常結構中顯示的信息。Exception 值是一個(gè)內部 VMM 錯誤代碼。


棧跟蹤
f  [threadtableslot | threadtableaddress]

它顯示線(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 引用某種形式的存儲指令。

0)> dc @iar                        ___memmove64+000058        std    r7,8(r3)                        

r7 的當前內容將被存儲到內存地址中(向 r3 的當前值加 0x08 得出該地址)。從 mst 子命令的輸出可以看到,r3 的當前值是 FFFFFFFFFFFFFFF8,因此向 FFFFFFFFFFFFFFF8 加 0x08 將得到:

(0)> hcal FFFFFFFFFFFFFFF8+0x08                        Value hexa: 00000000          Value decimal: 0                        

這意味著(zhù) r7 的當前內容將被保存到地址 0X00。它匹配異常結構中 dar 字段顯示的值。

內核地址空間中的第一頁(yè)虛擬內存可通過(guò)內核代碼訪(fǎng)問(wèn),但是被標記為只讀。任何對該內存范圍執行寫(xiě)操作的嘗試將導致保護違反。





回頁(yè)首


進(jìn)程和線(xiàn)程

proc 子命令

在使用 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 輸出

thread 子命令

當使用 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 輸出

當前線(xiàn)程和進(jìn)程

status 子命令列出了所有 CPU 的當前線(xiàn)程和進(jìn)程的信息。

圖 18. status 命令輸出






回頁(yè)首


其他 kdb 子命令

  • 默認情況下,kdb 在 symbolic 模式下工作,并且大部分地址在輸出中顯示為 symbol + 偏移量。

    圖 19. kdb 輸出


    pvproc+000000 在這里使用 Symbol+偏移量格式。

    使用 ns 或設置 no_symbol,我們可以修改以上的格式:



    圖 20. ns 命令輸出


  • 使用 nm 子命令獲得符號的地址以及包含符號的可執行模塊的 Table Of Contents (TOC) 部分。

    圖 21. nm 命令輸出


 

  • 無(wú)參數 lke 子命令列出當前加載的擴展。
  • ts 子命令將地址轉換為符號表示。
  • CALCULATORS-Use hcal 用于十六進(jìn)制計算,dcal 用于十進(jìn)制計算。
  • 記錄 kdb session-(0)>set 日志文件的文件名。
    (0)> set loglevel 2

日志級別可設為 0、1 或 2。這決定將哪種信息記錄到日志文件中。值 0 表示禁止記錄到日志文件中。值 1 表示只記錄在提示時(shí)輸入的 kdb 命令。值 2 記錄 kdb 會(huì )話(huà)的輸入和輸出。





回頁(yè)首


結束語(yǔ)

查找系統崩潰的根本原因是一個(gè)單調乏味的過(guò)程,因此了解 kdb 非常有用,它供一種分析系統崩潰的系統方法。通過(guò) kdb,您將能夠迅速跟蹤導致系統崩潰問(wèn)題。此外,您還學(xué)習到一種很有價(jià)值技能,借助它不僅能夠節省大量調試時(shí)間,還可以了解可以避免系統崩潰的編程實(shí)踐。最后這點(diǎn)也很重要,這是一種可以快速解決崩潰問(wèn)題的系統性方法,它將幫助您贏(yíng)得客戶(hù)信任。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
GPU異構計算基礎知識
并發(fā)編程大掃盲:帶你了解何為線(xiàn)程上下文切換
CLR 完全介紹: 研究?jì)却鎲?wèn)題 -- MSDN Magazine, November 2006
Java進(jìn)階必備:利用 JVM 命令(jstack、jmap)排查 CPU 100%、內存泄露 問(wèn)題
Linux進(jìn)程上下文切換過(guò)程context
《Windows核心編程》學(xué)習筆記(7)– 詳解線(xiàn)程
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久