hsy75的个人空间 https://blog.eetop.cn/vivilife [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

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

已有 3343 次阅读| 2013-4-27 11:08 |个人分类: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


1.2 尝试修改内核的调试信息,尝试找到定位:
这里参考了zhuqing_739的方法:具体见ref 2
.21 首先,编译内核时打开complie with debug info选项
.22 然后,利用GDB的命令进行调试


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






ref :
1 DEBUG HACKS



点赞

发表评论 评论 (1 个评论)

回复 ather 2013-8-8 18:24
不错:loveliness:

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 2

    粉丝
  • 1

    好友
  • 2

    获赞
  • 14

    评论
  • 3241

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-20 14:00 , Processed in 0.017170 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部