kernel or user oops信息定位步骤

1、获取oops信息

根据PC打印的地址,大致可以判断死在什么空间:kernel、module、user,对于kernel/user为2G:2G的分布如下:用户空间:0x0~0x7f000000, module:0x7f000000~0x800000000,kernel:0x80000000~0xffffffff。

用户程序挂掉如果需要打印pc指针,内核需要进行相应的支持:[*] Verbose user fault messages。

另外,arch/arm/kernel/traps.c中参数user_debug=31设置。

以下以用户程序为例,挂掉后打印如下信息。

lag:1

Pid: 444, comm:               hidemo

CPU: 0    Tainted: P             (3.0.8 #11)

PC is at 0x4bac0

LR is at 0x52478

pc : [<0004bac0>]    lr : [<00052478>]    psr: 28000010

sp : 4acfd370  ip : 006ba9bc  fp : 4acfd3bc

r10: 00152f0c  r9 : 00000000  r8 : 00188244

r7 : 00000152  r6 : 4acfdb50  r5 : 0001b018  r4 : 00000005

r3 : 00000000  r2 : 00000000  r1 : 000282b0  r0 : 00412158

Flags: nzCv  IRQs on  FIQs on  Mode USER_32  ISA ARM  Segment user

内核的打印:

CPU: 0 Tainted: G O(3.4.7_stm24_0304-4.4-b2020-h416_a9 #1)
PC is at display_init+0x10/0x51c [stvideo]
LR is at stvideo_init+0x180/0x24c [stvideo]
pc : [<7f20f374>] lr : [<7f051180>] psr: 60000013
sp : 88cd1e28 ip : 88490200 fp : 00000000
r10: 0000001c r9 : 00000024 r8 : 00000001
r7 : 88490074 r6 : 00000001 r5 : 88490000 r4 : 00000000
r3 : 00000064 r2 : 00000000 r1 : 00000020 r0 : 00000000
Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user

2、反汇编

反汇编为了打印函数名等信息,编译添加-g ;另外,不要通过strip命令将符号表信息去除。

反汇编可以使用另种方式:objdump和gdb的disassemble命令。对于上面用户程序没有打印堆栈的调用情况无法确定函数,则使用objdump命令:

arm-hisiv200-linux-objdump -DSl test_dump> disassamble.txt。

对于kernel一般会打印函数调用情况,这时使用gdb比较方便。先确定函数定义的文件,然后找到出现问题版本的文件.o,接着 gdb *.o,进入gdb调试界面再输入反汇编命令:

disassemble display_init

3、根据oops信息分析

0004b3c8 <HI_PointFont2RGB>:

4b3c8:        e52db004        push {fp}            ; (str fp, [sp, #-4]!)

4b3cc:         e28db000        add  fp,sp, #0

4b3d0:        e24dd04c        sub   sp,sp, #76        ; 0x4c

……..

4ba8c:        ea000027        b       4bb30<HI_PointFont2RGB+0x768>

4ba90:        e51b3040        ldr    r3,[fp, #-64]     ; 0x40

4ba94:        e1d330b4        ldrh  r3,[r3, #4]

4ba98:        e51b2030        ldr    r2,[fp, #-48]     ; 0x30

4ba9c:        e0020293        mul  r2,r3, r2

4baa0:        e51b302c        ldr    r3, [fp, #-44]     ; 0x2c

4baa4:        e0823003        add  r3,r2, r3

4baa8:        e50b3028        str    r3,[fp, #-40]     ; 0x28

4baac:        e51b3040        ldr    r3,[fp, #-64]     ; 0x40

4bab0:        e593201c        ldr    r2,[r3, #28]

4bab4:        e51b3028        ldr    r3,[fp, #-40]     ; 0x28

4bab8:        e1a031c3        asr   r3, r3, #3

4babc:        e0823003       add  r3,r2, r3

4bac0:        e5d33000       ldrb  r3, [r3]

4bac4:        e54b3019        strb  r3,[fp, #-25]

4bac8:        e51b302c        ldr    r3,[fp, #-44]     ; 0x2c

4bacc:         e50b3020        str    r3,[fp, #-32]

4bad0:        e55b2019        ldrb  r2,[fp, #-25]

4bad4:        e51b3028        ldr    r3,[fp, #-40]     ; 0x28

4bad8:        e1e03003        mvn r3,r3

4badc:        e2033007        and  r3,r3, #7

4bae0:        e1a03352        asr   r3,r2, r3

4bae4:        e2033001        and  r3,r3, #1

4bae8:        e20330ff          and  r3,r3, #255      ; 0xff

4baec:        e3530000        cmp r3,#0

…….

4bb78:        e49db004        pop  {fp}            ; (ldr fp, [sp], #4)

4bb7c:        e12fff1e bx     lr

取值PC:当前PC

译码PC:当前PC-4

执行PC:当前PC-8

从上面红色的部分可以看到,r3=00000000,然后再进行操作就出错了。

根据PC地址寻找到函数名,然后根据地址前后汇编代码及oopsr0~r7的值,结合函数源码进行分析可能出错地方。也可以使用IDA.pro.5.5dapro55软件进行汇编执行流程图形化查找出错原因。

4、其他情况

如果堆栈信息里指定的PC指针在用户态或者内核态,但是对二进制文件反汇编时,没有找到对应的定制,或者PC指针地址远大于反汇编代码地址。这个时候蹦掉,很可能是临时申请堆栈,数组越界等情况。

kernel or user oops信息定位步骤相关推荐

  1. 依据linux Oops信息准确定位错误代码所在行

    在linux下调tvp5150am1的过程中,遇到了一kernel oops,内容如下: [   66.714603] Unable to handle kernel paging request a ...

  2. Linux驱动段错误,linux驱动调试--段错误之oops信息分析

    下面根据Oops信息来分析一下段错误 first_drv.c 点击(此处)折叠或打开 #include #include #include #include #include #include #in ...

  3. linux驱动调试--段错误之oops信息分析

    原文地址 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29401328&id=4923447 发生段错误原因就是访问 ...

  4. 嵌入式Linux——oops:根据oops信息,找到错误的产生位置以及函数的调用关系

    简介: 本文主要介绍通过oops信息找到程序中出错位置的方法.并结合自己代码中的错误来讲解如何找到出错位置.同时还会介绍使用栈信息来推到函数间的调用关系.  Linux内核:linux-2.6.22. ...

  5. Android linux Oops 信息

    项目调试中碰见过多次,之前不懂是 Oops,下面记录下 linux中经常遇到下面情况出现空指针,导致 linux 死掉: linux sys 创建的节点中 store 函数返回值不是 return c ...

  6. linux内核 异常 log,Linux Kernel WARN()/BUG(), Oops/Panic, Tainted分析

    稳定性范畴, 参考5.x kernel. kernel Oops Oops指的就是内核的不正确行为,比如对驱动来说:static int i82092aa_pci_probe(struct pci_d ...

  7. Linux kernel 不输出log信息

    /********************************************************************************** Linux kernel 不输出 ...

  8. linux驱动调试--oops信息

    在移植dm9000 时被一个错误困扰了很久,当时手里只有printk调试手段,觉得自己应该升级下了,先学习了根据oops信息来调试. 先构造一个错误,insmod后抛出如下信息 我们着重看这几句 PC ...

  9. Linux Kernel 多个本地信息泄露漏洞

    漏洞名称: Linux Kernel 多个本地信息泄露漏洞 CNNVD编号: CNNVD-201306-028 发布时间: 2013-06-04 更新时间: 2013-06-04 危害等级:    漏 ...

  10. Linux Kernel ‘mp_get_count()’函数本地信息泄露漏洞

    漏洞名称: Linux Kernel 'mp_get_count()'函数本地信息泄露漏洞 CNNVD编号: CNNVD-201311-054 发布时间: 2013-11-06 更新时间: 2013- ...

最新文章

  1. php jq实现抽奖,jquery实现抽奖系统
  2. Spring-AOP @AspectJ进阶之切点复合运算
  3. 程序员深夜啪啪啪真相,看完笑翻!
  4. c++ 双端队列 deque 之 (头部、尾部)插入元素/删除元素/
  5. Error:java: 无效的标记 -version 编译错误的解决办法
  6. ASP.NET 2.0 中的 Theme 功能
  7. 访问Web服务器时 使用的协议是,使用SOAP协议访问Web服务
  8. 洛谷P1151、P1200、P1420、P1634题解(Java语言描述)
  9. alternatives命令用法
  10. 深入实践Spring Boot1.3 使用Spring Boot
  11. python中if语句的实例_如何在Python中的if语句中调用某个函数?
  12. weblogic部署微服务项目
  13. 关于cesium1.92以上版本无法加载draco压缩模型问题
  14. 水下声学的基本声学量介绍
  15. 查询电脑ip地址方法
  16. python 网络编程基础
  17. 怎么压缩图片200k以下?这个压缩工具,3秒无损完成
  18. 这是一场 DDD 的探索之旅
  19. 电脑微信聊天记录迁移——备份与恢复
  20. excel多表数据汇总

热门文章

  1. 小任务之使用SVG画柱状图~
  2. supervisord的安装
  3. error: not found: value sc
  4. 20145307第二次JAVA学习实验报告
  5. 玩转Metasploit系列(第二集)
  6. php中sprintf与printf函数用法区别
  7. Objective C类方法load和initialize的区别
  8. jenkins2 pipeline高级
  9. Can't connect to X11 window server using 'localhos
  10. Avoiding GREEDYDATA for logstash'grok