Linux Kernel Panic報錯解決思路

2021-06-16 23:50:57 字數 4890 閱讀 7837

panic是英文中是驚慌的意思,linux kernel panic正如其名,linux kernel不知道如何走了,它會盡可能把它此時能獲取的全部資訊都列印出來。

有兩種主要型別kernel panic:

1.hard panic(也就是aieee資訊輸出)

2.soft panic (也就是oops資訊輸出)

kernel panic-not syncing fatal exception in interrupt

kernel panic - not syncing: attempted to kill the idle task!

kernel panic - not syncing: killing interrupt handler!

kernel panic - not syncing

:attempted to kill init !

檢視了一下

linux

的原始碼檔案,找到相關位置

kernel/panic.c

noret_type void panic(const char * fmt, ...)

{static char buf[1024];

va_list args;

bust_spinlocks(1);

va_start(args, fmt);

vsnprintf(buf, sizeof(buf), fmt, args);

va_end(args);

printk(kern_emerg "kernel panic - not syncing: %s/n",buf);

bust_spinlocks(0);

kernel/exit.c

if (unlikely(in_interrupt()))

panic("aiee, killing interrupt handler!"); #中斷處理

if (unlikely(!tsk->pid))

panic("attempted to kill the idle task!"); #空任務

if (unlikely(tsk->pid == 1))

panic("attempted to kill init!"); #初始化

只有載入到核心空間的驅動模組才能直接導致kernel panic,你可以在系統正常的情況下,使用lsmod檢視當前系統載入了哪些模組。

除此之外,內建在核心裡的元件(比如memory map等)也能導致panic。

因為hard panic和soft panic本質上不同,因此我們分別討論。

一般出現下面的情況,就認為是發生了kernel panic:

機器徹底被鎖定,不能使用

數字鍵(num lock),大寫鎖定鍵(caps lock),滾動鎖定鍵(scroll lock)不停閃爍。

如果在終端下,應該可以看到核心dump出來的資訊(包括一段」aieee」資訊或者」oops」資訊)

和windows藍屏相似

原因:對於hard panic而言,最大的可能性是驅動模組的中斷處理(interrupt handler)導致的,一般是因為驅動模組在中斷處理程式中訪問乙個空指標(null pointer)。一旦發生這種情況,驅動模組就無法處理新的中斷請求,最終導致系統崩潰。

資訊收集

根據panic的狀態不同,核心將記錄所有在系統鎖定之前的資訊。因為kenrel panic是一種很嚴重的錯誤,不能確定系統能記錄多少資訊,下面是一些需要收集的關鍵資訊,他們非常重要,因此盡可能收集全,當然如果系統啟動的時候就kernel panic,那就無法只知道能收集到多少有用的資訊了。

/var/log/messages: 幸運的時候,整個kernel panic棧跟蹤資訊都能記錄在這裡。

應用程式/庫 日誌: 可能可以從這些日誌資訊裡能看到發生panic之前發生了什麼。

其他發生panic之前的資訊,或者知道如何重現panic那一刻的狀態

終端螢幕dump資訊,一般os被鎖定後,複製,貼上肯定是沒戲了,因此這類資訊,你可以需要借助數位相機或者原始的紙筆工具了。

如果kernel dump資訊既沒有在/var/log/messages裡,也沒有在螢幕上,那麼嘗試下面的方法來獲取(當然是在還沒有宕機的情況下):

如果在圖形介面,切換到終端介面,dump資訊是不會出現在圖形介面的,甚至都不會在圖形模式下的虛擬終端裡。

確保螢幕不黑屏,可以使用下面的幾個方法:

從終端,拷貝螢幕資訊(方法見上)

完整棧跟蹤資訊的排查方法

使用核心除錯工具(kenrel debugger ,aka kdb)

如果跟蹤資訊只有一部分且不足以用來定位問題的根本原因時,kernel debugger(kdb)就需要請出來了。

kdb編譯到核心裡,panic發生時,他將核心引導到乙個shell環境而不是鎖定。這樣,我們就可以收集一些與panic相關的資訊了,這對我們定位問題的根本原因有很大的幫助。

使用kdb需要注意,核心必須是基本核心版本,比如是2.4.18,而不是2.4.18-5這樣子的,因為kdb僅對基本核心有效。

症狀:

沒有hard panic嚴重

通常導致段錯誤(segmentation fault)

可以看到乙個oops資訊,/var/log/messages裡可以搜尋到』oops』

機器稍微還能用(但是收集資訊後,應該重啟系統)

原因:凡是非中斷處理引發的模組崩潰都將導致soft panic。在這種情況下,驅動本身會崩潰,但是還不至於讓系統出現致命性失敗,因為它沒有鎖定中斷處理例程。導致hard panic的原因同樣對soft panic也有用(比如在執行時訪問乙個空指標)

資訊收集:

當soft panic發生時,核心將產生乙個包含核心符號(kernel symbols)資訊的dump資料,這個將記錄在/var/log/messages裡。為了開始排查故障,可以使用ksymoops工具來把核心符號資訊轉成有意義的資料。

為了生成ksymoops檔案,需要:

今天就遇到 乙個客戶機器核心報錯:「kernel panic-not syncing fatal exception」

重啟後正常,幾個小時後出現同樣報錯,系統down了,有時重啟後可恢復有時重啟後仍然報同樣的錯誤。

我先來解釋一下什麼是fatal exception?

「致命異常(fatal exception)表示一種例外情況,這種情況要求導致其發生的程式關閉。通常,異常(exception)可能是任何意想不到的情況(它不僅僅包括程式錯誤)。致命異常簡單地說就是異常不能被妥善處理以至於程式不能繼續執行。

軟體應用程式通過幾個不同的**層與作業系統及其他應用程式相聯絡。當異常(exception)在某個**層發生時,為了查詢所有異常處理的**,各個**層都會將這個異常傳送給下一層,這樣就能夠處理這種異常。如果在所有層都沒有這種異常處理的**,致命異常(fatal exception)錯誤資訊就會由作業系統顯示出來。這個資訊可能還包含一些關於該致命異常錯誤發生位置的秘密資訊(比如在程式儲存範圍中的十六進製制的位置)。這些額外的資訊對使用者而言沒有什麼價值,但是可以幫助技術支援人員或開發人員除錯程式。

當致命異常(fatal exception)發生時,作業系統沒有其他的求助方式只能關閉應用程式,並且在有些情況下是關閉作業系統本身。當使用一種特殊的應用程式時,如果反覆出現致命異常錯誤的話,應將這個問題報告給軟體**商。 」

而且此時鍵盤無任何反應,必然使用reset鍵硬重啟。

panic.c原始檔有個方法,當panic掛起後,指定超時時間,可以重新啟動機器

方法:#vi /etc/sysctl.conf  新增

kernel.panic = 20 #panic error中自動重啟,等待timeout為20秒

kernel.sysrq=1 #啟用magic sysrq  否則,鍵盤滑鼠沒有響應

按住 [alt]+[sysrq]+[command], 這裡sysrq是print scr鍵,而command按以下來解釋!

b – 立即重啟

e – 傳送sigterm給init之外的系統程序

o – 關機

s – sync同步所有的檔案系統

u – 試圖重新掛載檔案系統

配置一下以防萬一。

很多網友安裝linux出現「kernel panic-not syncing fatal exception in interrupt」是由於網絡卡驅動原因。

解決方法:將選項「onboard lan」的選項「disabled」,重啟從光碟機啟動即可。

如出現以下報錯:

init() r8168 … 

… …… :kernel panic: 

fatal exception

r8168是網絡卡型號。

#tar  vjxf  r8168-8.014.00.tar.bz2

# make  clean  modules 

(as root or with sudo)

# make  install

# depmod  -a

# modprobe  r8168

安裝好系統後reboot進入bios把網絡卡開啟。

另有網友在kernel panic出錯資訊中看到「alc880」,這是個音效卡型別。嘗試著將音效卡關閉,重啟系統,搞定。

安裝linux系統遇到安裝完成之後,無法啟動系統出現kernel panic-not syncing fatal exception。很多情況是由於板載音效卡、網絡卡、或是cpu 超執行緒功能(hyper-threading )引起的。這類問題的解決辦法就是先檢視錯誤**中的資訊,找到錯誤所指向的硬體,將其禁用。系統啟動後,安裝好相應的驅動,再啟用該硬體即可。

另外出現「kernel panic — not syncing: attempted to kill init」和「kernel panic — not syncing: attempted to kill idle task」有時把記憶體互相換下位置或重新插拔下可以解決問題。

virt clone報錯解決

操作 命令列執行virt clone 報錯資訊 traceback most recent call last file usr bin virt clone line 25,in import virtinst file usr lib python2.4 site packages virtin...

extjs ie 報錯解決

extjs 4.0.2 在ff下正常,但是 ie 6 7 8 都存在不同程度的錯誤,總是提示類似 ext.cache 為空或不是物件 events 為空或不是物件 dom.style 為空或不是物件 之類的錯誤,很多人提到是因為 js 語法裡面末尾元素多 造成的 但是檢查了多遍都不是,因為報錯是在 ...

SVN報錯解決

當我們安裝好visualsvnserver伺服器後,首先在伺服器平台上建立新的版本庫,新增使用者和使用者組,接下來就要將本機的專案匯入到版本庫中了。右鍵專案資料夾 tortoisesvn 匯入 然而,會出現以下報錯 考慮到可能的原因有以下幾種 a.windows 自帶的或使用者自己安裝的防火牆遮蔽了...