kernel or user oops信息定位步骤
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信息定位步骤相关推荐
- 依据linux Oops信息准确定位错误代码所在行
在linux下调tvp5150am1的过程中,遇到了一kernel oops,内容如下: [ 66.714603] Unable to handle kernel paging request a ...
- Linux驱动段错误,linux驱动调试--段错误之oops信息分析
下面根据Oops信息来分析一下段错误 first_drv.c 点击(此处)折叠或打开 #include #include #include #include #include #include #in ...
- linux驱动调试--段错误之oops信息分析
原文地址 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29401328&id=4923447 发生段错误原因就是访问 ...
- 嵌入式Linux——oops:根据oops信息,找到错误的产生位置以及函数的调用关系
简介: 本文主要介绍通过oops信息找到程序中出错位置的方法.并结合自己代码中的错误来讲解如何找到出错位置.同时还会介绍使用栈信息来推到函数间的调用关系. Linux内核:linux-2.6.22. ...
- Android linux Oops 信息
项目调试中碰见过多次,之前不懂是 Oops,下面记录下 linux中经常遇到下面情况出现空指针,导致 linux 死掉: linux sys 创建的节点中 store 函数返回值不是 return c ...
- linux内核 异常 log,Linux Kernel WARN()/BUG(), Oops/Panic, Tainted分析
稳定性范畴, 参考5.x kernel. kernel Oops Oops指的就是内核的不正确行为,比如对驱动来说:static int i82092aa_pci_probe(struct pci_d ...
- Linux kernel 不输出log信息
/********************************************************************************** Linux kernel 不输出 ...
- linux驱动调试--oops信息
在移植dm9000 时被一个错误困扰了很久,当时手里只有printk调试手段,觉得自己应该升级下了,先学习了根据oops信息来调试. 先构造一个错误,insmod后抛出如下信息 我们着重看这几句 PC ...
- Linux Kernel 多个本地信息泄露漏洞
漏洞名称: Linux Kernel 多个本地信息泄露漏洞 CNNVD编号: CNNVD-201306-028 发布时间: 2013-06-04 更新时间: 2013-06-04 危害等级: 漏 ...
- Linux Kernel ‘mp_get_count()’函数本地信息泄露漏洞
漏洞名称: Linux Kernel 'mp_get_count()'函数本地信息泄露漏洞 CNNVD编号: CNNVD-201311-054 发布时间: 2013-11-06 更新时间: 2013- ...
最新文章
- php jq实现抽奖,jquery实现抽奖系统
- Spring-AOP @AspectJ进阶之切点复合运算
- 程序员深夜啪啪啪真相,看完笑翻!
- c++ 双端队列 deque 之 (头部、尾部)插入元素/删除元素/
- Error:java: 无效的标记 -version 编译错误的解决办法
- ASP.NET 2.0 中的 Theme 功能
- 访问Web服务器时 使用的协议是,使用SOAP协议访问Web服务
- 洛谷P1151、P1200、P1420、P1634题解(Java语言描述)
- alternatives命令用法
- 深入实践Spring Boot1.3 使用Spring Boot
- python中if语句的实例_如何在Python中的if语句中调用某个函数?
- weblogic部署微服务项目
- 关于cesium1.92以上版本无法加载draco压缩模型问题
- 水下声学的基本声学量介绍
- 查询电脑ip地址方法
- python 网络编程基础
- 怎么压缩图片200k以下?这个压缩工具,3秒无损完成
- 这是一场 DDD 的探索之旅
- 电脑微信聊天记录迁移——备份与恢复
- excel多表数据汇总