oops内核崩溃错误跟踪

以网上别人出现的一个内核崩溃的oops来分析

Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c72f0000
[00000000] *pgd=b7bcd031, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#1]
Modules linked in: aerial g_inc_110a_driver
CPU: 0
PC is at __irq_svc+0x38/0xa4
LR is at 0xc032f488
pc : []    lr : []    Not tainted
sp : c752fc98  ip : c752fcb0  fp : c752fd54
r10: 00000050  r9 : c752e000  r8 : c034e258
r7 : 00000000  r6 : c752fd74  r5 : c752fccc  r4 : ffffffff
r3 : 20000013  r2 : c004b448  r1 : c032f488  r0 : c752fce0
Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  Segment user
Control: 397F
Table: B72F0000  DAC: 00000015
Process inc_110a (pid: 346, stack limit = 0xc752e260)
Stack: (0xc752fc98 to 0xc7530000)
fc80:                                                       000021b8 000021b8
fca0: c0024e69 a0000013 00000000 c752fe08 c752fd74 00000000 c034e258 c752fe08
fcc0: 00000050 c752fd54 c752fcb0 c752fce0 c032f488 c004b448 20000013 ffffffff
fce0: c752fd04 c752fcf0 c0045bdc a0000013 00000001 c7fdda40 c752fd34 c752fd08
fd00: c0046bf4 c0045bc0 c00459cc 20000093 00000001 c05e2d24 00000000 c05e2d24
fd20: 00000000 00000001 c752fd44 00000000 c752fe08 c001b520 00000000 c001b520
fd40: c752fe08 00000000 c752fd6c c752fd58 c004b524 c004b144 c752fd7c c752fd74
fd60: c752fd9c c752fd80 c002bc70 c004b50c c02e1118 c02e10f8 00000000 c02e10f8
fd80: ffffffff 00000000 c03471c8 c7feb5a0 c752fddc c752fda0 c002beac c002bc2c
fda0: c0326740 0000001d c7f94ea0 00000000 c752e000 ffffffff 00000000 c03471c8
fdc0: c7feb5a0 c0024e68 60000013 c752e000 c752fdf4 c752fde0 c002bf8c c002bcac
fde0: ffffffff c752fe3c c752fe04 c752fdf8 c002c004 c002bf78 c752fe6c c752fe08
fe00: c00249cc c002bff8 c752fe34 80000042 80000042 a79c29a7 c4ec4ec5 00000014
fe20: c03471c8 c7feb5a0 c0024e68 4c2eb9c7 c752e000 c752fe6c c752fe70 c752fe50
fe40: 00000fa0 00000000 20000013 ffffffff c005aba8 c0289d5c 00000014 c752feb0
fe60: c752feac c752fe70 c0288a18 c002f984 c752feac c752fe80 c0054bc0 c00545c0
fe80: c0070954 0085f284 00000014 c752feb0 c03300e8 c0024e68 4c2eb9c7 00000000
fea0: c752fee4 c752feb0 c0289d5c c028894c c0352d50 c0352d50 0085f284 c0055120
fec0: c7feb5a0 c0352928 c0016f2c c0016f2c 4c2eb9c7 00000036 c752fef4 c752fee8
fee0: c0289db4 c0289ccc c752ff2c c752fef8 bf001ef0 c0289d9c c752ff28 c752ff10
ff00: c0129fec c7fd86e0 c0016f2c 4c2eb9c7 00000036 c0024e68 c752e000 00000000
ff20: c752ff4c c752ff30 c00a1c6c bf000e1c 00000000 c7fd86e0 00000003 4c2eb9c7
ff40: c752ff7c c752ff50 c00a1f48 c00a1bfc c7f94ea0 4c2eb968 00000000 c7fd86e0
ff60: fffffff7 c0016f2c c0024e68 c752e000 c752ffa4 c752ff80 c00a1fb8 c00a1c94
ff80: 4b3f8a6e 00000001 c0025cac 00000000 00000018 4c2ec490 00000000 c752ffa8
ffa0: c0024cc0 c00a1f84 00000000 00000018 00000003 c0016f2c 4c2eb9c7 00000003
ffc0: 00000000 00000018 4c2ec490 00000036 4002ab3c 003d0f00 40040000 4c2eb9d4
ffe0: 00000078 4c2eb9b8 0000a770 40288dac 20000010 00000003 00000000 00000000
Backtrace:
[] (vprintk+0x0/0x3c4) from [] (printk+0x28/0x30)
[] (printk+0x0/0x30) from [] (__do_kernel_fault+0x50/0x80)
 r3 = C02E10F8  r2 = 00000000  r1 = C02E10F8  r0 = C02E1118
[] (__do_kernel_fault+0x0/0x80) from [] (do_page_fault+0x20c/0x238)
 r7 = C7FEB5A0  r6 = C03471C8  r5 = 00000000  r4 = FFFFFFFF
[] (do_page_fault+0x0/0x238) from [] (do_translation_fault+0x20/0x80)
[] (do_translation_fault+0x0/0x80) from [] (do_PrefetchAbort+0x18/0x1c)
 r5 = C752FE3C  r4 = FFFFFFFF
[] (do_PrefetchAbort+0x0/0x1c) from [] (__pabt_svc+0x4c/0x80)
[] (sched_clock+0x0/0x90) from [] (schedule+0xd8/0x678)
 r6 = C752FEB0  r5 = 00000014  r4 = C0289D5C
[] (schedule+0x0/0x678) from [] (schedule_timeout+0x9c/0xd0)
[] (schedule_timeout+0x0/0xd0) from [] (schedule_timeout_uninterruptible+0
x24/0x28)
 r7 = 00000036  r6 = 4C2EB9C7  r5 = C0016F2C  r4 = C0016F2C
[] (schedule_timeout_uninterruptible+0x0/0x28) from [] (inc_110a_ioctl+0x1
0e0/0x113c [g_inc_110a_driver])
[] (inc_110a_ioctl+0x0/0x113c [g_inc_110a_driver]) from [] (do_ioctl+0x7c/
0x98)
[] (do_ioctl+0x0/0x98) from [] (vfs_ioctl+0x2c0/0x2f0)
 r6 = 4C2EB9C7  r5 = 00000003  r4 = C7FD86E0
[] (vfs_ioctl+0x0/0x2f0) from [] (sys_ioctl+0x40/0x64)
 r9 = C752E000  r8 = C0024E68  r6 = C0016F2C  r5 = FFFFFFF7
 r4 = C7FD86E0
[] (sys_ioctl+0x0/0x64) from [] (ret_fast_syscall+0x0/0x2c)
 r6 = 4C2EC490  r5 = 00000018  r4 = 00000000
Code: e1a0100e e885001f e1a096ad e1a09689 (e5998004)
Kernel panic - not syncing: Aiee, killing interrupt handler!

从上面的错误我们看到这里:Unable to handle kernel NULL pointer dereference at virtual address 00000000 显然这里是引用了空指针

我们找baketrace:

Backtrace:
[] (vprintk+0x0/0x3c4) from [] (printk+0x28/0x30)
[] (printk+0x0/0x30) from [] (__do_kernel_fault+0x50/0x80)
 r3 = C02E10F8  r2 = 00000000  r1 = C02E10F8  r0 = C02E1118
[] (__do_kernel_fault+0x0/0x80) from [] (do_page_fault+0x20c/0x238)
 r7 = C7FEB5A0  r6 = C03471C8  r5 = 00000000  r4 = FFFFFFFF
[] (do_page_fault+0x0/0x238) from [] (do_translation_fault+0x20/0x80)
[] (do_translation_fault+0x0/0x80) from [] (do_PrefetchAbort+0x18/0x1c)
 r5 = C752FE3C  r4 = FFFFFFFF
[] (do_PrefetchAbort+0x0/0x1c) from [] (__pabt_svc+0x4c/0x80)
[] (sched_clock+0x0/0x90) from [] (schedule+0xd8/0x678)
 r6 = C752FEB0  r5 = 00000014  r4 = C0289D5C
[] (schedule+0x0/0x678) from [] (schedule_timeout+0x9c/0xd0)
[] (schedule_timeout+0x0/0xd0) from [] (schedule_timeout_uninterruptible+0
x24/0x28)
 r7 = 00000036  r6 = 4C2EB9C7  r5 = C0016F2C  r4 = C0016F2C
[] (schedule_timeout_uninterruptible+0x0/0x28) from [] (inc_110a_ioctl+0x1
0e0/0x113c [g_inc_110a_driver])
[] (inc_110a_ioctl+0x0/0x113c [g_inc_110a_driver]) from [] (do_ioctl+0x7c/

在这里后面的函数调用backtrace下面的第一个函数被后面的第二个函数调用,第二个函数被后面的第三个函数调用,一直往下到inc_110a_ioctl这个函数,这个函数在驱动文件g_inc_110a_driver里面,同时看到前面

Modules linked in: aerial g_inc_110a_driver

分析可知是前面那个驱动文件里面的ioctl函数里面用到了空指针。你可以去分析源程序看哪里有可能会出现空指针,另一种发放是用反汇编。

使用 arm-linux-objdump -D -S g_inc_110a_driver.ko >log 将驱动文件反汇编一下 输出到log文件里面,再打开log文件查看。

出现错误的地方在PC is at __irq_svc+0x38/0xa4 也就是说在驱动文件里面的0x38行对应的代码处。

打开log后里面的有一行会打印程序开始的起始地址,我们这里假设是前面这个00000000

那么出错的地方就在0x38那一行。如果是其它的地址那就是程序开始的地方加上0x38的偏移地址。即出错的地方在xxxxxxxx+0x38的地方。

找到了处错误的地方,修改就很简单了。

你可能感兴趣的:(arm/2440)