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

[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

*Rx!u _9R5br t%Fx0

}BZpN+{4N0
1.2 尝试修改内核的调试信息,尝试找到定位:
这里参考了zhuqing_739的方法:具体见ref 2
.21 首先,编译内核时打开complie with debug info选项
.22 然后,利用GDB的命令进行调试
龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台+x)q\3I;xH*De

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

&}XNY D5v^H1z0

6T|wd%j3`*{u"V0
龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台]-|H:|s

+Qe9XT{3u`4_ Q^0
龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台xOg\0x.Hs,`

ref :
1 DEBUG HACKS
龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台$J,q7yJKZb;Bi

*{['jd"A'd F'^0

TAG: pointer 技术

ather的龙8国际娱乐官方网站 引用 删除 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