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指针地址远大于反汇编代码地址。这个时候蹦掉,很可能是临时申请堆栈,数组越界等情况。
- kernel or user oops信息定位步骤
- kernel oops
- oops定位
- linux kernel Oops调试信息分析 异常调试
- 如何定位OOPS信息在源文件中的位置
- LINUX内核调试相关--oops信息的定位
- LINUX内核调试相关--oops信息的定位
- LINUX内核调试相关--oops信息的定位
- kernel oops 分析
- linux kernel oops
- Linux kernel oops
- kernel oops之后....
- linux kernel -oops
- kernel oops 分析
- Understanding a Kernel Oops!
- Understanding a Kernel Oops
- Understanding a Kernel Oops!
- kernel Oops的问题
- maven-shade-plugin 入门指南
- dvp和mipi接口
- solr删除全部索引数据
- 排序 基数排序
- FFMPEG —— 视频播放器 :(一)环境配置
- kernel or user oops信息定位步骤
- Android_自定义Toast、子线程修改UI
- centos系统下nodejs项目通过nginx做代理
- 1.3组件之间传值
- svn之bash: syntax error near unexpected token `(' 解决办法
- POJ 3321-Apple Tree(DFS序+树状数组)
- nodejs 注入 inject
- 新人自述
- 结构体的内存对齐