一.问题:
产线反馈有2台机器,放置或者操作tp过程多次出现自动重启。平均5到10分钟重启一次;
二.原因
2.1 根本原因:
CPU SOC异常损坏,导致CPU访问非法指令、访问非法内存地址,触发系统Reboot.
三.解决方案
3.1 更换Emmc + DDR + CPU
四.分析过程
4.1 Log:
//是一个内核级的错误,通常称为“Oops”, #1表示错误代码
[11008:sh]Internal error: Oops: 96000004 [#1] PREEMPT SMP
[11008:sh]CPU: 1 PID: 11008 Comm: sh Tainted: P W O 4.9.190 #1
CPU:CPU1执行oops错误
PID: 进程/线程的PID:11008
Comm:进程或线程的名
Tainted:标志位掩码
[11008:sh]PC is at anon_vma_interval_tree_insert+0x40/0x90
[11008:sh]LR is at anon_vma_clone+0x10c/0x198
PC:当前CPU运行位置,
LR:函数返回地址,以定位函数被调关系
0x40/0x90:表示函数开始偏移量 (字节)、0x90:函数的大小
//Trace开始:调用栈,从下往上读,调用关系
[11008:sh]Call trace:
[11008:sh][<ffffff8f7648b1b8>] dump_backtrace+0x0/0x290
[11008:sh][<ffffff8f7648b1b0>] show_stack+0x14/0x1c
[11008:sh][<ffffff8f767e071c>] dump_stack+0xcc/0x104
[11008:sh][<ffffff8f76bac130>] mrdump_common_die+0xe8/0x170
[11008:sh][<ffffff8f76bad3a4>] ipanic_die+0x20/0x74
[11008:sh][<ffffff8f764d1014>] notify_die+0x64/0xb4
[11008:sh][<ffffff8f7648b560>] die+0x118/0x2c8
[11008:sh][<ffffff8f7649e010>] __do_kernel_fault+0x90/0xa0
[11008:sh]mrdump: add MD:0xffffffe8ba400000 sz:0x0 failed
//触发系统重启
[11008:sh]exception reboot
//CPU访问了一个非法地址:
[3090ffe89de08a38] address between user and kernel address ranges
4.2 addr2line反编译
PC逻辑地址=PC基地址 +偏移量
pc:当前CPU运行位置,lr:函数返回地址,以定位函数被调关系
PC is at anon_vma_interval_tree_insert+0x40/0x90
4.2.1 根据关键字找出偏移量:0x40
anon_vma_interval_tree_insert+0x40
4.2.2 根据pc 运行函数计算PC基地址:
nm vmlinux |grep "anon_vma_interval_tree_insert"
返回:ffffff80082016e4 T anon_vma_interval_tree_insert
4.2.3 PC逻辑地址=PC基地址 +偏移量
=0xffffff80082016e4 + 0x40 = 0xFFFFFF8008201724
4.2.4 使用addr2line命令反编译代码
命令:addr2line –e vmlinux 逻辑地址
addr2line -e vmlinux 0xFFFFFF8008201724
4.3 定位到源码:
/home/android005/work/2_E7171/mt6765/kernel-4.9/mm/interval_tree.c :16
五.方案验证
5.1 更换Emmc:Memory + DDR: 测试2天复现;
5.2 更换CPU+Emmc:测试7天未复现;