当前位置:  技术问答>linux和unix

如何分析段错误

    来源: 互联网  发布时间:2016-09-05

    本文导语:  我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: e...

我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 : []    lr : []    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 [] from []
r7:00008000 r6:00000024 r5:cef30000 r4:bf1d9180
Function entered at [] from []
Function entered at [] from []
Function entered at [] from []
r5:bf1e753c r4:cf7b3eac
Function entered at [] from []
Function entered at [] from []
r5:00000064 r4:00000000
Function entered at [] from []
Function entered at [] from []
Code: e121f003 e590c044 e35c0000 0a000012 (e59c500c)

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

|
从寄存器内容可以看到  出错地址 pc : [] 返回地址lr : [] 
从Backtrace可以看到  函数入口 Function entered at [] 上层函数 from []

出错的语句和函数的地址都有了,通过检查符号表、反汇编,应该很快就可以定位。

|

0x30 = 48
ARM9每条指令长度是4字节,PC就是第12条指令。
硬件是IXP400系列,采用ArmV5TE体系结构,五级流水线,分别为取指,译码,执行,缓存,写回
因为流水线的原因,对于数据访问指令,PC和出错指令相差2条指令。

|

如这位兄弟所说,通过backtrace可以找到错误代码的地方,有时并不是当前指令错误,库函数出现问题的机率较小,但也不能完全说没有问题。大部分是因为前面传入的参数有问题导致。

这需要编译的时候把包含符号表的ELF文件保留,然后可到处符号表以及反汇编
反汇编的命令是objdump,使用-D 和-S参数可以反汇编,汇编代码和源码交替

lr寄存器是函数调用的返回地址,即上一个函数调用当前函数的地方,通过调用关系找错误代码的地方

如楼主所说printk有时并不能准确定位问题所在,字符放在缓存中没有打印出来。有时添加打印会导致编译出来的可执行代码出现大的变化,错误的地方会变化,或者没有了,以前做开发时碰到过。

|
操作步骤如下:
1、在编译源代码的时候加上选项-g -c,生成对应.o文件为hello.o
2、找到对应平台(你用的是ARM的就要找对应ARM的)下的objdump工具,执行objdump -j .text -Sl hello.o > 2.txt
3、打开文件2.txt,搜索上面OOPS中对应最后一行e59c500c或者0a000012 指令
Code: e121f003 e590c044 e35c0000 0a000012 (e59c500c)
4、该指令附近就有你源代码对应的行数。

    
 
 

您可能感兴趣的文章:

  • ftp错误,请高手帮分析一下
  • 进来看看错误提示,谁来分析一下原因
  • linux出现内核错误,请各位前辈帮忙分析
  • php的慢速日志引起的Mysql错误问题分析
  • 分析UNIX非正常关机出现的错误提示
  • 内核编译错误,请帮我分析一下
  • Build xorg时提示的错误,帮忙分析下是否autoreconf automake版本问题?多谢!
  • C语言创建链表错误之通过指针参数申请动态内存实例分析
  • 请教:我 make 我的开发板的 uclinux-dist 时,出现先的错误,请各位大哥帮我分析,是不是我有什么步骤没有做?
  • 由Apache 500错误引出的临时文件问题分析解决
  • linux下make后的信息,大家分析一下错误!
  • ORACLE常见错误代码的分析与解决(一)
  • java struts常见错误以及原因分析
  • ORACLE常见错误代码的分析与解决二
  • ORACLE常见错误代码的分析与解决(二)
  • SQL Server连接三个最常见错误分析
  • SQL Server连接中三个常见的错误分析
  • NOSQL iis7站长之家
  • 发个squid的错误信息大家帮忙分析一下
  • SQLServer 连接失败错误故障的分析与排除
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • HASH查找的程序实现及性能分析
  • 如何获取shell词法分析,语法分析及解释器的内容和信息
  • http协议介绍,文件上传分析及程序举例
  • 两台机器同时出现同样的故障,有人能帮分析分析吗?
  • linux下free命令显示的内存使用情况分析
  • 请教高手帮我分析分析!
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • 我想编程分析任意一个java文件,把其中的注释部分删掉,请帮我分析一下思路和方法好吗?
  • Docker支持更深入的容器日志分析
  • 如何分析linux宕机原因(或者说如何通过查日志分析宕机原因)
  • mongodb的优点和缺点详细分析
  • Python的词法分析与语法分析
  • Docker容器分析----好处和缺点介绍
  • 大家帮我分析分析:Samba的配置问题
  • docker源码分析之容器日志处理与log-driver实现
  • ubuntu 下安装libpcap 的时候make时候出错 请帮忙分析分析
  • c/c++服务器程序内存泄露问题分析及解决
  • 200分求教有关linux核心的dos攻击算法分析以及源代码的情景分析,研究用,急!!!
  • spring的事务类型及spring和hibernate可能导致的问题分析
  • Java 代码分析工具 JHawk
  • Mysql大表查询优化技巧总结及案例分析
  • 显微镜数据分析 Gwyddion


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3