1. 程式人生 > >kernel panic 分析解決方法

kernel panic 分析解決方法

 kernel panic 表示Linux kernel走到了一個不知道該怎麼走下一步的狀況,一

旦到這個情況,kernel就儘可能把它此時能獲取的全部資訊都打印出來,至於能打印出多少資訊。

 下面講解幾種用於查找出錯函式定位的方法

首先看一下出錯的kernel panic 現象,下面是一個kernel panic的出錯log:


如上崩潰資訊,可知發生崩潰的函式為rb_init_debugfs

崩潰的地址為0x804386f8

1>linux下,到工程的如下目錄下:kernel/linux,找到檔案vmlinux,執行命令gdb vmlinux

在gdb命令下執行如下命令即可查詢到出錯函式所在的檔案與行數

(gdb) b *0x804386f8

2>

如果不確定崩潰的地址是否是0x804386f8,可以在檔案System.map中

查詢函式rb_init_debugfs獲取該函式的地址,然後加上偏移地址(本例中偏移地址為0x14 rb_init_debugfs+0x14/0x70)即可。

3>直接函式名加偏移量也可以

(gdb) b *rb_init_debugfs+0x14

  上面是出錯模組是編譯進核心的,對於編譯進核心的模組可以通過gdb vmlinux來確定出錯函式所在的檔案與行數。

那如果出錯模組是動態載入進核心的該怎麼辦呢?

   這就需要使用objdump進行反彙編操作了,使用如下命令,就會將C語言與組合語言同時顯示(需要加-g命令)

#objdump -S  **.o -g

 如果使用上面命令,還是隻顯示彙編,而沒有c語言的話,不用擔心,在你編譯驅動模組的Makefile中,編譯成.o檔案時,增加-g選項,對於新生成的.o檔案再使用上面的命令就 可以看到彙編與c語言共存了。然後根據kernel panic提示中顯示的函式名加上偏移量就能找到出錯行了。