linux 內核出現 oops 如何調試

       正兒八經上了半年的班了,也接觸linux驅動幾個月了,不過今天之前還是不會調試。今天也還是沒有徹底學會。這篇博客主要是把今天的收穫記錄下來,方便以後參考。

我的內核版本是:4.9.88

我在3.14.52裏面也實驗過。

先貼我內核打印的錯誤信息:

Unable to handle kernel NULL pointer dereference at virtual address 00000004
pgd = 80004000
[00000004] *pgd=00000000
Internal error: Oops: 817 [#1] PREEMPT SMP ARM
Modules linked in: spi_lqd(O)
CPU: 1 PID: 96 Comm: spi1 Tainted: G           O 3.14.52-1.1.1_ga #235
task: a8326d00 ti: a82f6000 task.ti: a82f6000
PC is at spi_pump_messages+0xdc/0x480
LR is at _raw_spin_lock_irqsave+0x18/0x5c
pc : [<8041c40c>]    lr : [<8075bdc8>]    psr: 60070093
sp : a82f7f08  ip : 00000000  fp : a837ddcc
r10: 80d0f504  r9 : 00000001  r8 : a82f6000
r7 : a837ddb4  r6 : a837dc00  r5 : 80d0f504  r4 : a837dde8
r3 : a8902704  r2 : 00000000  r1 : a0070013  r0 : 00000000
Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
Control: 10c53c7d  Table: 38af404a  DAC: 00000015
Process spi1 (pid: 96, stack limit = 0xa82f6238)
Stack: (0xa82f7f08 to 0xa82f8000)
7f00:                   a837ddcc 80d0f504 00000000 a837ddb4 a82f6000 a837ddcc
7f20: 80d0f504 00000000 a837ddb4 a82f6000 00000001 80d0f504 a82f6000 80045408
7f40: a8326d00 00000000 a8194d00 a837ddb4 800453bc 00000000 00000000 00000000
7f60: 00000000 8004528c 36e5fded 00000000 dcd7bffd a837ddb4 00000000 00000000
7f80: a82f7f80 a82f7f80 00000000 00000000 a82f7f90 a82f7f90 a82f7fac a8194d00
7fa0: 800451c0 00000000 00000000 8000e500 00000000 00000000 00000000 00000000
7fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
7fe0: 00000000 00000000 00000000 00000000 00000013 00000000 ff9df7fd f5f7fedb
[<8041c40c>] (spi_pump_messages) from [<80045408>] (kthread_worker_fn+0x4c/0x164)
[<80045408>] (kthread_worker_fn) from [<8004528c>] (kthread+0xcc/0xe4)
[<8004528c>] (kthread) from [<8000e500>] (ret_from_fork+0x14/0x34)
Code: eafffff5 e2432024 e58b2028 e8930005 (e5802004)
---[ end trace 004e9320330cff5a ]---
note: spi1[96] exited with preempt_count 1

 

它告訴空指針什麼的。怎麼看懂這個錯誤信息,可以百度。

我們找到關鍵的兩行:

PC is at spi_pump_messages+0xdc/0x480
LR is at _raw_spin_lock_irqsave+0x18/0x5c

LR就是異常的地方:

這個時候,你可以使用gdb去調試。

操作如下:

arm-poky-linux-gnueabi-gdb vmlinux           //arm-poky-linux-gnueabi-gdb  這個是我的交叉編譯鏈。好像直接使用gdb也行

然後輸入: l *spi_pump_messages+0xdc     就可以具體到對應的代碼處,它會告訴你在哪個文件的哪一行。

如果出現:Reading symbols from vmlinux...(no debugging symbols found)...done.

說明你內核編譯的時候沒有加添加調試信息的選項。那麼你需要重新編譯內核,操作如下:

make menuconfig

Kernel hacking  --->

Compile-time checks and compiler options  ---> 

 [*] Compile the kernel with debug info      //我這裏之前沒有勾選。按y勾選,勾選後就有*號

然後保存,退出,重新編譯。

編譯完成後,在內核源碼的根目錄下就有  vmlinux

編譯完成,使用  arm-poky-linux-gnueabi-gdb vmlinux   就可以了。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章