四步定位linux内核oops原因
总结
1. 根据oops信息,找到出问题的函数xxx_func,以及对应的xxx文件
2. 根据gdb和xxx.o文件 ;使用《 disassemble /m xxx_func 》来反汇编出代码,已经代码对应的汇编码;注意xxx_func若有内联函数的话,可能显示不全,建议不要用内联函数,而直接用代码替换
3. 根据oops信息找到出问题的pc指针,根据这个pc相对于xxx_func的偏移,找到出问题的代码行,代码下面会有汇编码,这个汇编的寄存器,又可以在oops信息里找到寄存器的快照(汇编不懂就用ai解释下)
4. 寄存器的值,再加上oops最开始的提示,比如会是nullptr(一般是错误使用空指针);还是*pte=00000(一般是被提前释放过了);还是abort on non-linefetch(一般是内存访问不了,可能硬件错误)
示例1
oops信息如下
<1> [54245.466372] Unable to handle kernel NULL pointer dereference at virtual address 00000010
<1> [54245.474729] pgd = c1794000
<1> [54245.477443] [00000010] *pgd=01090831, *pte=00000000, *ppte=00000000
<0> [54245.483879] Internal error: Oops: 17 [#1] PREEMPT THUMB2
<4> [54245.638361] CPU: 0 PID: 21542 Comm: iw Not tainted 3.10.33 #2
<4> [54245.644095] task: c1348000 ti: c13e2000 task.ti: c13e2000
<4> [54245.649524] PC is at nl80211_send_iface+0xc/0x160
<4> [54245.654221] LR is at nl80211_new_interface+0x1cf/0x224
<4> [54245.659345] pc : [<c02956ec>] lr : [<c029a56f>] psr: 40000033
sp : c13e3c40 ip : 0000005d fp : 00000000
<4> [54245.670813] r10: 00000014 r9 : c13e3ca0 r8 : c0923100
<4> [54245.676028] r7 : 00000002 r6 : c17b8000 r5 : 00000000 r4 : c0923100
<4> [54245.682555] r3 : 00000000 r2 : 673be4b6 r1 : 00005426 r0 : c0923100
<4> [54245.689082] Flags: nZcv IRQs on FIQs on Mode SVC_32 ISA Thumb Segment user
反汇编打印如下,0xc的是12,其反汇编是ldr.w r9,[r5,#16],用于从由 r5
和偏移量 16
计算得到的内存地址加载 32 位数据到寄存器 r9
中;但是上面的寄存器信息中R5 = 0 ;所以对应到代码中就是wdev是空指针
示例2
比如entry成员r1,加上四个字节的地址就是出问题的地址,这个地址的pte为0 ,证明被提前释放掉内存了
示例3
针对external abort相关的错误,上述方法会导致有可能软件确定不了出问题的地方,那基本上是硬件问题,比如发现pcie设备的参考时钟会断,导致pcie传输数据的时候,访问pcie内存空间失败
<1> [ 23.834843] Unhandled fault: imprecise external abort (0xc06) at 0x01a9559c
<0> [ 23.841827] Internal error: : c06 [#1] PREEMPT THUMB2
<4> [ 23.900082] CPU: 0 PID: 952 Comm: kmodloader Not tainted 3.10.33 #12
<4> [ 23.906426] task: c129b500 ti: c12aa000 task.ti: c12aa000
<4> [ 23.911855] PC is at aicwf_pcie_host_init+0x13/0x82 [aic8800D80_fdrv]
<4> [ 23.918321] LR is at rwnx_init_aic+0x50/0x8a [aic8800D80_fdrv]
<4> [ 23.924146] pc : [<bf9046c0>] lr : [<bf8ee9e3>] psr: 80000033
sp : c12abbf8 ip : 00000000 fp : 00000000
<4> [ 23.935614] r10: c1f92f40 r9 : bf919d18 r8 : bf90d5b4
<4> [ 23.940830] r7 : c1f93000 r6 : c1f90440 r5 : cb1dc000 r4 : c11e0000
<4> [ 23.947357] r3 : cb1dfb64 r2 : cb1dc048 r1 : cb1dc04c r0 : 00000000
<4> [ 23.953853] Flags: Nzcv IRQs on FIQs on Mode SVC_32 ISA Thumb Segment user
<4> [ 23.961173] Control: 50c53c7d Table: 01238059 DAC: 00000015