免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2925 | 回复: 6
打印 上一主题 下一主题

如何分析段错误 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-16 22:08 |只看该作者 |倒序浏览
我insmod一个模块的时候出错,打印出如下信息:

Unable to handle kernel NULL pointer dereference at virtual address 00000010
pgd = ceed0000
[00000010] *pgd=0ee7e031, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#1]
Modules linked in: epl sg sd_mod usb_storage scsi_mod uhci_hcd ehci_hcd usbcore moxa_dio moxa_software_id mxser_uc8400(P) nfs nfs_acl lockd sunrpc ixp400_eth ixp400
CPU: 0    Tainted: P         (2.6.23.1 #986)
pc : [<c0079618>]    lr : [<bf1d7ddc>]    psr: 20000093
sp : cf7b3de8  ip : 00000004  fp : cf7b3e08
r10: 00008060  r9 : 00000002  r8 : 34092e16
r7 : c026e260  r6 : 000000d0  r5 : cef30000  r4 : a0000013
r3 : a0000093  r2 : 00000000  r1 : 000000d0  r0 : c026e260
Flags: nzCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 000039ff  Table: 0eed0000  DAC: 00000015
Process insmod (pid: 917, stack limit = 0xcf7b225
Stack: (0xcf7b3de8 to 0xcf7b4000)
3de0:                   bf1d9180 bf1d9180 cef30000 00000024 00008000 cf7b3e3c
3e00: cf7b3e0c bf1d7ddc c00795f4 cf7b3e40 cf7b3e44 bf1d9180 0000803c 00000024
3e20: 00008000 bf1e25f0 00000002 cf7b3e70 cf7b3e6c cf7b3e40 bf1d674c bf1d7d70
3e40: cf7b3e4c c003b2c4 bf1e25f0 cf7b3e70 00000024 000249f0 bf1dd310 bf1dd308
3e60: cf7b3e88 cf7b3e70 bf1ca244 bf1d6704 c003b2c4 cf7b3eac bf1e753c cf7b3e98
3e80: cf7b3e8c bf1ca300 bf1ca214 cf7b3ecc cf7b3e9c bf1d4f60 bf1ca2fc cf7b3ebc
3ea0: cf7b3eac c003b2c4 c003af38 bf1db4b8 bf1db838 bf1db868 00000000 00000064
3ec0: cf7b3f04 cf7b3ed0 bf107184 bf1d4ea4 c0074964 bf1dc590 bf1dc590 bf1dc590
3ee0: bf1dc590 cccccccd d08d8fc0 00000019 bf1dc59c bf1dc590 cf7b3fa4 cf7b3f08
3f00: c005a778 bf10700c 00000000 cf7b2000 00000000 00000000 00000000 00000000
3f20: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
3f40: 0000000c 00000018 d08e4068 cf71c030 00000000 d08d9268 d08c1000 0000000b
3f60: 00000000 000005d6 000005d6 d08d9380 00000017 00000000 00000000 00000028
3f80: beab2e83 beab2dac 00000080 c001dfc4 cf7b2000 401a3048 00000000 cf7b3fa8
3fa0: c001de20 c005a65c beab2e83 beab2dac 00900080 401aa008 00027418 00097008
3fc0: 00000028 beab2e83 beab2dac 4000b10c 00000002 0000c814 401a3048 beab2d24
3fe0: beab2cf0 beab2ce4 0000fa34 40153f00 60000010 00900080 00000000 00000000
Backtrace:
Function entered at [<c00795e8>] from [<bf1d7ddc>]
r7:00008000 r6:00000024 r5:cef30000 r4:bf1d9180
Function entered at [<bf1d7d64>] from [<bf1d674c>]
Function entered at [<bf1d66f8>] from [<bf1ca244>]
Function entered at [<bf1ca208>] from [<bf1ca300>]
r5:bf1e753c r4:cf7b3eac
Function entered at [<bf1ca2f0>] from [<bf1d4f60>]
Function entered at [<bf1d4e98>] from [<bf107184>]
r5:00000064 r4:00000000
Function entered at [<bf107000>] from [<c005a778>]
Function entered at [<c005a650>] from [<c001de20>]
Code: e121f003 e590c044 e35c0000 0a000012 (e59c500c)

从此输出的错误信息中,我如何能最快的定位到出错语句?
(用printk(...)一段段定位的方式是能找到错误点,但效率太低,我希望有更高效的找错方法)
谢谢!

论坛徽章:
0
2 [报告]
发表于 2010-06-16 23:27 |只看该作者
Oh, it is ARM again. I am not familiar with ARM. But I think following addresses are the functions:

Function entered at [<c00795e8>] from [<bf1d7ddc>]

Maybe you could enable symbol in your kernel? Or you can try to convert those addresses to function names or line numbers of source code.

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2010-06-17 08:42 |只看该作者
这个oops信息打印不出来函数名称啊。
如果你对整个程序比较了解,用printk加上提前return是可以快速定位到问题的。

论坛徽章:
1
天蝎座
日期:2014-02-28 16:08:53
4 [报告]
发表于 2010-06-18 00:39 |只看该作者
哈哈内核文档里有linus的经验之谈,不过没有机会和耐心试过

论坛徽章:
0
5 [报告]
发表于 2010-06-18 15:55 |只看该作者
我把大概的代码以及一些尝试写一下,希望大家帮我分析:

pSharedMem = kmalloc(ulShMemSize,GFP_KERNEL); // 此句执行OK,ulShMemSize的值是32864
......
// 下面这句执行crash,其中sizeof(struct sShbMemTable)的值是12
psMemTableElement = kmalloc(sizeof(struct sShbMemTable),GFP_KERNEL);  

我做了如下尝试(主要是更改错误的那个kmalloc)都失败:
(1)不赋值,改成kmalloc(sizeof(struct sShbMemTable),GFP_KERNEL);  
(2)sizeof(struct sShbMemTable)直接换成12,改成psMemTableElement = kmalloc(12,GFP_KERNEL);  
(3)分配大小改为32864,改成psMemTableElement = kmalloc(32864,GFP_KERNEL);  
(4)GFP_KERNEL换成GFP_ATOMIC,改成psMemTableElement = kmalloc(sizeof(struct sShbMemTable),GFP_ATOMIC);  

但改成下面这一句就能执行通过(与上面的(3)相比十分令人不解):
psMemTableElement = kmalloc(ulShMemSize,GFP_KERNEL);  
这里ulShMemSize的值是32864;但直接用数字32864却会crash,十分奇怪。 当然,这里多分配了这儿多空间肯定是不符合上下文环境的,这里仅供分析。(这里用ulShMemSize是因为上面红色的那句是执行通过的)

我的平台是ARM,32位系统,linux2.6.23.1。

谢谢!

论坛徽章:
0
6 [报告]
发表于 2010-06-18 16:38 |只看该作者
这个oops信息打印不出来函数名称啊。
如果你对整个程序比较了解,用printk加上提前return是可以快速定位到 ...
Godbach 发表于 2010-06-17 08:42



怎么才能让它打印出函数名称啊?我知道用户态程序加个“-g”就行了,内核态程序应该加什么编译参数啊?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2010-06-18 16:40 |只看该作者
这个估计和内核以及CPU的结构有关系吧。普通X86平台,2.6的内核中,出现oops信息,通常会打印出函数名的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP