引出:
嵌入式开发时候,动态加载模块的时候,经常遇到空指针问题,linux内核会打印一些信息,比如oops,如何利用oops的信息确实是个技术
案例1:
[ 283.660000] Unable to handle kernel NULL pointer dereference at virtual address 00000014
[ 283.660000] pgd = 80004000
[ 283.660000] [00000014] *pgd=00000000
[ 283.660000] Internal error: Oops: 17 [#1] SMP
[ 283.660000] last sysfs file: /sys/devices/virtual/vc/vcsa2/dev
[ 283.660000] Modules linked in: fusion lnxplatLirc lirc_dev pvrvssbc pvrnxpdc pvrsrvkm vpmfbDrv(P) lnxpvrDrv(P) lnxtmvssDrv lnxtmvssDrvGPL lnxtmasDrv lnxcssDrv lnxfssDrv lnxscsDrv lnxplatDrv lnxnotifyqDrv lnxKKALDrv lnxplatnativeDrv
[ 283.660000] CPU: 0 Tainted: P (2.6.34 #1)
[ 283.660000] PC is at thread_group_cputime+0x38/0xa4
[ 283.660000] LR is at thread_group_cputimer+0x64/0x9c
[ 283.660000] pc : [<80062334>] lr : [<80062488>] psr: 80000193
[ 283.660000] sp : 804abde4 ip : 804abdf8 fp : 804d85e8
[ 283.660000] r10: 2756f126 r9 : 0000011b r8 : 804b5cc0
[ 283.660000] r7 : 00000000 r6 : fffffe9c r5 : 00000000 r4 : 00000000
[ 283.660000] r3 : 00000000 r2 : 00000000 r1 : 0000011f r0 : 804b5978
[ 283.660000] Flags: Nzcv IRQs off FIQs on Mode SVC_32 ISA ARM Segment kernel
[ 283.660000] Control: 10c53c7d Table: 1901004a DAC: 00000017
[ 283.660000] Process swapper (pid: 0, stack limit = 0x804aa2f8)
[ 283.660000] Stack: (0x804abde4 to 0x804ac000)
[ 283.660000] bde0: 804abe40 804b5d7c a0000193 804b5cc0 804b5978 00000000 0000011f
[ 283.660000] be00: 00000000 00000000 804b5978 804abe50 804b5cc0 808fab70 808fab70 80063c6c
[ 283.660000] be20: f2e31100 001312cf 808fb580 8002a580 804dcf20 804b5978 804ac080 0000000f
。。。。。。
[ 283.660000] bfc0: 804dcbac 800214f4 808f7180 804b6664 0002008c 800089f0 800083bc 00000000
[ 283.660000] bfe0: 00000000 800214f4 10c53c7d 804d1a84 800214f0 00008080 00000000 00000000
[ 283.660000] [<80062334>] (thread_group_cputime+0x38/0xa4) from [<00000000>] (0x0)
[ 283.660000] Code: 0a00001b e590824c e1a06000 e1a07001 (e5964178)
1.1 如何定位错误,别忘了这是在动态加载库里面?
按照大和一洋的说法和给出的例子,如果是打开了:KALLSYMS,打印应该是能看到模块的名字和具体的字节地址:他给的例子也确实如此,有模块名字和地址,这和我现在的情况不同。
网上有一些貌似打开的办法,但是好像都言而无终。。。参考: ref 3
1.2 尝试修改内核的调试信息,尝试找到定位:
.21 首先,编译内核时打开complie with debug info选项
.22 然后,利用GDB的命令进行调试
几种获得Linux内核未导出符号的方法
ref :1 DEBUG HACKS