kernel or user oops信息定位步骤

来源:互联网 发布:wps for mac 编辑:程序博客网 时间:2024/06/06 18:33

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指针地址远大于反汇编代码地址。这个时候蹦掉,很可能是临时申请堆栈,数组越界等情况。