问题背景:
工模测试出现自动重启。
分析过程:
用GAT解开db,并结合对应的vmlinux(该文件必须和db一致,具体请看FAQ06985),利用工具E-Consulter分析(也可以参考FAQ13941),分析里几个db发现都是内存踩坏,随机踩,这种情况要么是软件引入的,要么是硬件故障。
做以下调查:
- 单体复现还是多台机器出现?
- 什么时候出现?之前是否就存在?
- 复现概率?
反馈的结果:
- 多台机器出现。
- 最近才出现。
- 基本上1、2小时即可打出来。
这种情况,最快的是回溯版本,因此建议如下:
- 检查会复现和不会复现的版本对比,细分版本验证,找出引起问题的改动。
- 在所有版本导入如下修改,用于抓取内存乱踩故障,加速定位问题:FAQ14614 如何用MMU保护buddy system?
- 检查2个版本的patch。
在第2步导入,同时切换eng版本,再次抓到问题点,E-Consulter工具分析结果如下:
== 异常报告v1.4(仅供参考) ==
详细描述: 断言失败{主动调用BUG()/BUG_ON()},请结合崩溃进程调用栈检查相关代码
异常时间: 4182.704223秒, Thu Apr 14 19:00:59 CST 2016
== CPU信息 ==
崩溃CPU信息:
CPU8: 进程名: hps_main, 进程标识符(pid): 208, 中断: 关
本地调用栈:
vmlinux object_err(s=0xFFFFFFC04E601180, page=0xFFFFFFBE016F9618, object=0xFFFFFFC029065400) + 104 <mm/slub.c:738>
vmlinux free_debug_processing(s=0xFFFFFFC04E601180, page=0xFFFFFFBE016F9618, object=0xFFFFFFC029065400, addr=-274874499176, flags=0xFFFFFFC06A5AB418) + 792 <mm/slub.c:1163>
vmlinux __slab_free(s=0xFFFFFFC04E601180, page=0xFFFFFFBE016F9618, x=0xFFFFFFC029065400, addr=-274874499176) + 696 <mm/slub.c:2632>
vmlinux slab_free() + 528 <mm/slub.c:2778>
vmlinux kfree(x=0xFFFFFFC029065400) + 720 <mm/slub.c:3443>
vmlinux kobject_cleanup() + 160 <lib/kobject.c:631>
vmlinux kobject_release(kref=0xFFFFFFC065FC8A90) + 172 <lib/kobject.c:654>
vmlinux kref_sub() + 24 <include/linux/kref.h:74>
vmlinux kref_put() + 24 <include/linux/kref.h:99>
vmlinux kobject_put(kobj=0xFFFFFFC065FC8A58) + 56 <lib/kobject.c:671>
vmlinux cpufreq_cpu_put(policy=0xFFFFFFC065FC8980) + 12 <drivers/cpufreq/cpufreq.c:239>
vmlinux cpufreq_cpu_put() + 36 <drivers/cpufreq/cpufreq.c:2197>
vmlinux cpufreq_get_policy(policy=0xFFFFFFC06A5AB5F8) + 92 <drivers/cpufreq/cpufreq.c:2195>
vmlinux cpu_hotplug_handler(nb=cpu_hotplug, val=2, data=8) + 236 <drivers/misc/mediatek/sched/rq_stats.c:490>
vmlinux notifier_call_chain() + 132 <kernel/notifier.c:124>
vmlinux __raw_notifier_call_chain(nr_to_call=-1, nr_calls=0) + 8 <kernel/notifier.c:445>
vmlinux __cpu_notify() + 24 <kernel/cpu.c:260>
vmlinux cpu_notify(val=2, v=8) + 32 <kernel/cpu.c:268>
vmlinux _cpu_up(cpu=8, tasks_frozen=0) + 520 <kernel/cpu.c:630>
vmlinux _cpu_up_profile() + 2