kernel panic 分析解決方法
阿新 • • 發佈:2019-02-11
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提示中顯示的函式名加上偏移量就能找到出錯行了。