像我儿子一样永远保持好奇和梦想

[draft]【调试技术01】NULL pointer&根据linux Oops定位错误代码行

上一篇 / 下一篇  2013-04-27 11:08:57 / 个人分类:practic_linux

引出:
嵌入式开发时候,动态加载模块的时候,经常遇到空指针问题,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

/Da+y-U P[cnI0
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台K-F_&WC
1.2 尝试修改内核的调试信息,尝试找到定位:
这里参考了zhuqing_739的方法:具体见ref 2
.21 首先,编译内核时打开complie with debug info选项
.22 然后,利用GDB的命令进行调试

i*z@ta0

几种获得Linux内核未导出符号的方法

^j,]h1O$Lx.vPB0

*S.}7N+m%gG I0
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台5|7QE4d9I7W8[

v9g }Zv0

8silI;I[5P*L^0j`0

ref :
1 DEBUG HACKS

+^fvi:`KB5k?0

&ce5vt-{5x0

TAG: pointer 技术

ather的个人空间 引用 删除 ather   /   2013-08-08 18:24:17
不错
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar