Melis系统崩溃问题分析以及解决思路

在使用Melis 系统开发时,会经常遇到系统崩溃死机的问题,对于此类问题大家总是避之不及, 分析原因, 一方面是此类问题涉及到CPU异常模式架构,需要用户对arm CPU架构具有较深的技术储备。另一方面,异常处理代输出的调试信息不够直观,不太友好的调试界面使用户失去了直面问题的勇气。 所以一般情况下的解决思路都是回避问题,通过不断修改业务代码来试错. 这种解决思路不但效率低下,而且很有可能没有找到根本问题,为将来留下隐患. 下面推荐一种直接分析此类问题的思路, 供参考。

预备知识(以ARM9为例,ARMV5TE指令集)

在初始化阶段 Melis将异常向量的入口映射到了0xffff0000开始的高地址.
在程序中的实现如下图, 通过链接脚本的操作,这些代码将被放置在0xffff0000地址运行.

问题场景

处理器进入异常模式一般有三种情况:

  • 非法指令,对应异常入口0xFFFF0004
  • 取指异常, 对应异常入口0xFFFF000C
  • 数据存取异常, 对应异常入口0xFFFF0010

本文对以上三种异常死机的情况分析类似,所以就以数据存取异常分析为例介绍整个分析过程.

Crash现场

Crash现场打印寄存器如下图,下面演示如何利用DS5倒推出死机位置,定位导致死机的代码.

###分析过程###

  • 第一步,定位异常入口, 从打印信息可以很明显看出,这是一条数据存取异常, 所以对应的异常入口地址应该是0xFFFF0010. 异常时刻寄存器已经全部打印出来,实际上可以通过将图中所有寄存器值恢复到CPU的寄存器堆中,使时光倒流回异常发生的时刻. 但是这里有一个问题, 上图的寄存器打印信息是目前melis2.0异常处理输出,较Melis1.0提供了更多的寄存器现场信息. 针对1.0是无法通过恢复打印寄存器的方式找回死机现场的. 本文针对Melis1.0.

  • 第二步, 修改异常入口, 由于异常处理代码本身会破坏寄存器现场,所以,在判断完异常处理类型,从而定位到异常入口后,我们修改异常入口,使CPU在异常处进入死循环,不再往下执行,这样做的目的是保留异常前最后时刻的寄存器现场,便于恢复, 见下图红色部分.

  • 第三步, 重新编译内核, 下载运行.

  • 第四步, DS-5 Attach到目标平台. 可以看到,CPU已经在异常入口处进入死循环,此时的寄存器由于没有被异常处理程序破坏,仍然保留了异常前的状态,只要使CPU恢复之前的状态,就能找到问题点.

  • 第五步, 恢复现场, 恢复现场, 现场恢复包括 1,处理器模式恢复,可以恢复lr, sp, cpsr. 2.通用寄存器恢复,由于现场没有被破坏,所以无需恢复通用寄存器,只需要恢复cpsr, 和lr即可。


这里要注意的是PC指针的恢复, 按照 newPC =lr -4的原则,恢复寄存器为0xc200d9f0

现场恢复后, 可以得到更多的关于死机点的信息,例如调用堆栈,源文件,函数,行号等等。 从中得到, 死机的原因是melis_init_thread函数中访问了非法地址:0xdeadbeec, 从而导致CPU进入到异常模式.

以上就是针对此类问题的总体思路,当然实际情况可能远比例子复杂。 即便如此,我们也能从中找到一些规律。 找到规律 是解决问题的第一步,规律不一定表示某种必然, 有时候随机也是一种规律,在错综复杂的问题现场中总有稳定的因素存在,这个时候如上的方法也是适用的。

Melis系统崩溃问题分析以及解决思路相关推荐

  1. Connection reset原因分析及解决思路

    Connection reset原因分析及解决思路 - lwli - 博客园 我们在开发过程中经常会出现Connection reset问题,包括http调用,数据库连接等场景.出现Connectio ...

  2. chatGPT Access denied问题分析和解决思路

    chatGPT Access denied问题分析和解决思路 先说结论: Access denied于你所使用的网络环境有关,是你的代理服务器的ip被ban了 不是封号!! 首先要考虑VPS封禁问题, ...

  3. mysql authentication_MySQL连接抛出Authentication Failed错误的分析与解决思路

    [问题描述] 在应用端,偶尔看到有如下报错: Authentication to host 'xxxx' for user 'yyyy' using method 'mysql_native_pass ...

  4. 安装linux系统报softlock,soft lockup 解决思路

    一. 前言 前几天,帮同事一起查一个机器老是挂死无法进入问题,说有一台虚拟机时不时登陆不上挂死,同时甲方竟然没有这些主机监控,判断不了当时的cpu,内存,网络等的基础数据信息,那就只能看看内核信息了. ...

  5. 音视频播放疑难杂症分析和解决思路

    问题背景: 音视频相较于其他业务开发,门槛比较高的一个原因开发过程遇到问题比较多,而且每个问题背后都需要一定的理论基础和丰富的调试经验的才能分析出来.有些音视频开发小白,遇到一些诸如视频卡顿.声画不同 ...

  6. linux服务器崩,Linux系统崩溃最快速的解决方法

    现象: 在安装HP硬件监控(hpasmcli)提示需要依赖Glibc-2.7,而本机的是Glibc-2.5,看来得升级Glibc了,可惜在升级时又出现了更多的依赖问题,想到在其他服务器上安装hpasm ...

  7. 工业现场设备互联互通问题分析及解决思路

    摘要 信息技术与制造技术的深度融合推动智能制造.工业互联网快速发展,但目前工业领域普遍存在设备种类繁多.设备厂家多样.接口不同.通信协议多样等问题,从而导致设备间存在"信息孤岛"并 ...

  8. 分布式环境下,互斥性与幂等性问题,分析与解决思路

    欢迎关注方志朋的博客,回复"666"获面试宝典 随着互联网信息技术的飞速发展,数据量不断增大,业务逻辑也日趋复杂,对系统的高并发访问.海量数据处理的场景也越来越多.如何用较低成本实 ...

  9. linux中负载值为多少正常_Linux load average负载量分析与解决思路

    一.load average top命令中load average显示的是最近1分钟.5分钟和15分钟的系统平均负载.系统平均负载表示 系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或 ...

最新文章

  1. DesignPattern(四)结构型模式(下)
  2. 截取指定长度html内容,并保留html格式标记
  3. c++ eos智能合约开发_干货|EOS智能合约开发(一)EOS环境搭建和启动节点
  4. RLC协议简单理解2-RLC窗口的维护
  5. 线性规划、梯度下降、正规方程组——斯坦福ML公开课笔记1-2
  6. 【PP生产订单】入门介绍(四)
  7. 5、【设计模式】单列模式
  8. 2013 2016 年期末考试
  9. mysql 拼音查询_mysql实现用拼音搜索中文的数据库实现
  10. 自己动手写CPU(1)五级流水线及CPU第一条指令ori
  11. 仿网易云音乐客户端的底部播放器的实现思路
  12. 记一次MBR锁机病毒分析
  13. Python处理mongo结果中的ObjectId类型为字符串
  14. 软件设计模式概述(摘自《研磨设计模式》)
  15. python求均值方差不用numpy_【Python】不用numpy用纯python求极差、平均数、中位数、众数与方差,python的打印到控制台...
  16. 安装、选择-如何制作U盘系统盘以及U盘安装操作系统的方法 -by小雨
  17. Revit API: Dimension 尺寸标注
  18. 如果更有效预防应力作用?PCB设计如何考虑应力作用? 应力对元器件失效问题的讨论
  19. SYD8811 AES硬件加密
  20. 2022年意识科学十大主题焦点与研究进展

热门文章

  1. 河南移动联合中兴打造SPNPTN网络融合示范样板
  2. openstack 命令行管理一 - br-ex 网络设定 (备忘)
  3. Odp.Net 连接Oracle
  4. 造梦者,考研人,都会好的!【励志】
  5. 字符串———find()函数
  6. 【GNU笔记】【C扩展系列】128位整数 128-bit Integers
  7. AEB落地:摄像头与毫米波雷达的融合
  8. ModelSim使用技巧总结(入门向)
  9. 124、基于51单片机的智能电表功率电量仿真系统设计
  10. benefit中文官网