如何分析oops

2021-07-10 20:42:31 字數 1863 閱讀 8387

在linux上,oops即linux核心的行為不正確,並產生了乙份相關的

錯誤日誌。許多態別的oops會導致核心錯誤,即使系統立即停止工作,但部分oops也允許繼續操作,作為與穩定性的妥協。這個概念只代表乙個簡單的錯誤。

當核心檢測到問題時,它會列印乙個oops資訊然後殺死全部相關程序。oops資訊可以幫助linux核心工程師除錯,檢測oops出現的條件,並修復導致oops的

程式錯誤。

linux官方核心文件中提到的oops資訊被放在核心源**documentation/oops- tracing.txt中。通常klogd是用來將oops資訊從核心快取中提取出來的,然而,在某些系統上,例如最近的debian發行版 中,rsyslogd代替了klogd,因此,缺少klogd程序並不能說明log檔案中缺少oops資訊的原因。

若系統遇到了oops,一些內部資源可能不再可用。即使系統看起來工作正常,非預期的***可能導致活動程序被終止。核心oops常常導致核心錯誤,若系統試圖使用被禁用的資源。

因為剛開始學習linux核心,所以也只是略知一二,現在就將我的了解說說:

1. oops是什麼?

看lkd對oops的描述,oops就應該是unix系統的system panic,叫法不同而已。

什麼是panic呢?簡單的說就是核心程式錯誤引發的一種debug和保護機制,系統會dump出核心映像,裡面包含了當時cpu的狀態,程序的狀態,核心堆,棧的狀態...最直觀的最重要的恐怕就是 呼叫棧的back trace.

很多情況下,乙個oops是可以被重現的,根據呼叫棧的back trace和printk也許就搞定了問題。

但更多的時候,乙個oops是很難重現,比如乙個race condition.

這時候,分析乙個oops之後的crash dump檔案就變得尤為重要了。

2. 如何分析oops.

分析panic的思路和分析應用程式coredump的思路一樣的。

首先,要看呼叫的backtrace和錯誤訊息.

看程式是在哪個函式產生發生了錯誤,看訊息裡面有什麼有價值的資訊,比如空指標引用之類的。

其次,了解了backtrace在什麼位置,就可以結合源**來看是否有問題了。

幸運的話,光看具體函式的**也許就會發現問題。

但多數時候,還需要檢查crash dump的映像檔案的。

這時候,乙個好用的幫助分析crash dump的工具就尤為重要了。

在solaris下,我們可以通過mdb來檢視panic時在cpu執行的所有執行緒的狀態,

cpu暫存器的狀態,訊號量,鎖...

因為ia32的特性,呼叫棧、backtrace裡面每個函式的引數,都可以得到。

此外還有堆的狀態。

通過以上這些資料,我們會試圖重新描繪出系統崩潰那一剎那,發生了什麼。

在linux下,該如何做類似的分析工作呢?

因為種種原因,linux至今沒有整合kernel debug工具,但還是有一些第3方工具可用:

1.kdb

特點:二進位制,彙編級的除錯工具。只需要一台機器。

2.kgdb

特點:源**級的除錯工具,但需要兩台機器,null modem線連線。

侷限:需要patch重新編譯核心。而且,在事後分析crash dump檔案的情況下,尤其是當oops不可重現時,只能在彙編和二進位制下工作了。

3.gdb

特點:linux環境中自帶

侷限:功能有限,但檢查crash dump也許足夠了。

linus本人不提倡用kernel debug工具,那他們是如何檢查乙個crash dump檔案的呢?我猜想是用gdb

4.其它工具和方法...

大家不妨談談自己學習和使用這些工具的心得,拿出知道的一些資料共享一下。

0

給主人留下些什麼吧!~~

程式設計技巧OOPs 複製建構函式

oops 1.什麼是複製建構函式 我們知道建構函式是用來初始化我們要建立例項的特殊的方法。通常我們要將乙個例項賦值給另外乙個變數c 只是將引用賦值給了新的變數實質上是對同乙個變數的引用,那麼我們怎樣才可以賦值的同時建立乙個全新的變數而不只是對例項引用的賦值呢?我們可以使用複製建構函式。我們可以為類創...

lftp登入失敗 500 OOPS

配置vsftpd遇到的錯誤 lftp test1 127.0.0.1 ls ls 登入失敗 500 oops bad bool value in config file for anonymous enable 這是因為那個yes no布林值後邊加了乙個空格,即 anonymous enable n...

linux驅動除錯 段錯誤之oops資訊分析

1.分析coredump列印資訊 2.確定發生錯誤的函式 看發生錯誤的地方的函式和pc pc is at segment test open 0x14 0x1c segdrv 看pc值 pc 7f000014 lr 800d958c psr 20070013 看backtrace 7f000014 ...