鸿蒙HarmonyOS NEXT应用崩溃分析及修复

鸿蒙HarmonyOS NEXT应用崩溃分析及修复

如何保证应用的健壮性,其中一个指标就是看崩溃率,如何降低崩溃率,就需要知道存在哪些崩溃,然后对症下药,解决崩溃。那么鸿蒙应用中存在哪些崩溃类型呢?又改如何解决呢?

故障类型

目前鸿蒙中存在的崩溃主要分为CPP_CRASH、JS_ERROR、OOM、PROCESS_KILL、APP_FREEZE、RESOURCE_LEAK6大类型。

CPP_CRASH类型

主要是进程崩溃指C/C++运行时崩溃,主要体现在so相关的sdk上。

1.空指针解引用 NULL pointer dereference
形如SIGSEGV(SEGV_MAPERR)@0x00000000或r0 r1等传参寄存器的值为0时应首先考虑调用时是否传入了空指针

2.结构体/类未初始化指针
形如SIGSEGV(SEGV_MAPERR)@0x0000000c或 r1等传参寄存器的值为一个很小的值时应考虑调用入参的结构体成员是否包含空指针

3.程序主动终止SIGABRT
一般为用户/框架/C库主动触发,大部分场景下跳过C库/abort发起的框架库的第一帧即为崩溃原因
这里主要检测的是资源使用类的问题,如线程创建,文件描述符使用,接口调用时序等

4.栈溢出
如递归调用,析构函数相互调用,特殊的栈(信号栈)中使用大块栈内存

5.多线程操作集合
std的集合为非线程安全,如果多线程添加删除,容易出现SIGSEGV, 如果使用addr2line后的代码行与集合相关,可以考虑这个原因

6.不匹配的对象生命周期
如使用裸指针保存sptr类型以及shared_ptr类型

7.返回临时变量、野指针
如返回栈变量的引用,释放后未置空继续访问

具体可参考官方
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/fault-analysis

JS_ERROR类型

当未处理的JS异常导致应用意外退出时,应用会在抛出未处理的异常时崩溃并且会生成对应的JS Crash崩溃日志文件。

JS Crash异常根据不同的异常场景,在 Reason 字段进行了分类,分为Error、TypeError、SyntaxError、RangeError等错误类型。

自定义 Error 类:Error 是最基本的错误类型,其他的错误类型都继承自该类型。Error 对象主要有两个重要属性 message 和 name 分别表示错误信息和错误名称。程序运行过程中抛出的异常一般都有具体的类型,Error 类型一般都是开发人员自己抛出的异常。

TypeError(类型错误)类:运行时最常见的异常,表示变量或参数不是预期类型。

SyntaxError(语法错误)类:语法错误也称为解析错误。语法错误在任何编程语言中都是最常见的错误类型,表示不符合编程语言的语法规范。

RangeError(边界错误)类:表示超出有效范围时发生的异常,主要的有以下几种情况:
数组长度为负数或超长。
数字类型的方法参数超出预定义范围。
函数堆栈调用超过最大值。

ReferenceError - 引用错误:引用一个不存在的变量时发生的错误。每当我们创建一个变量时,变量名称都会写入一个变量存储中心中。这个变量存储中心就像键值存储一样,每当我们引用变量时,它都去存储中找到 key并提取并返回 value。如果我们要找的变量不在存储中,就会抛出 ReferenceError。

URI Error - URL错误:在调用 URI 相关的方法中 URL 无效时抛出的异常,主要包括 encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape() 和 unescape() 几个函数 。

其中这一类型的bug是最容易修复的,因为这些往往就是业务侧的一些不严谨代码导致的,异常也暴漏在业务层代码。

PROCESS_KILL类型

SWAP_FULL: 系统交换分区空间不足,系统清理;
LowMemoryKill:系统整机可用内存较低,系统清理;
CAMERA_QUICK_Kll:相机场景内存需求较大,需要查杀应用清理内存;
这个不是异常,如果想规避可以通过降低自身内存占用,降低被清理的优先级。

APP_FREEZE类型

主要对应Appfreeze事件:
THREAD_BLOCK_6S 应用主线程卡死超时。
APP_INPUT_BLOCK 用户输入响应超时。
LIFECYCLE_TIMEOUT Ability生命周期切换超时。

主线程Watchdog(3S/6S)
主线程Watchdog(3S/6S)

用户输入事件超时5S
用户输入超时

生命周期切换超时分为Ability生命周期切换超时和PageAbility生命周期切换超时。

该故障出现在生命周期切换的过程中,影响当前应用内Ability的切换或者不同PageAbility之间的切换。
生命周期超时

OOM类型

内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出。

RESOURCE_LEAK

资源泄漏是指句柄/线程/内存等资源超过系统设定上限,部分资源甚至失去了管控能力,此时系统可能出现卡死/重启等异常情况。LeakDetector模块提供资源泄漏检测、判决、维测日志抓取、日志上报的能力,为开发者提供详细的维测日志以辅助故障定位。

资源泄漏检测能力

故障恢复

代码定位

TypeError类问题在实际应用开发调试运行过程中是最常见的JS Crash类型,其表示为变量不是预期类型,在代码层面则为对变量的使用未进行事先的校验,在错误日志中报错多表现为如下:

Error name:TypeError
Error message:Cannot read property xxx of undefined

通过Error message很清除可以明白报错原因。

JS调用栈可直接通过超链接跳转到对应错误代码行,栈顶即为问题第一现场,如下样例所示。

Device info:xxx
Build info:xxx-xxx x.x.x.xxx(xxxx)
Fingerprint:ed1811f3f5ae13c7262b51aab73ddd01df95b2c64466a204e0d70e6461cf1697
Module name:com.xxx.xxx
Version:1.0.0
VersionCode:1000000
PreInstalled:No
Foreground:Yes
Pid:31255
Uid:20020145
Reason:Error
Error name:Error
Error message:JSERROR
Sourcecode:throw new ErrOr("JSERROR");^
Stacktrace:at anonymous (entry/src/main/ets/pages/Index.ets:13:19)

异常代码调用栈包含 SourceMap is not initialized yet ,表示因SourceMap转换非常耗时,改为通过异步线程去进行初始化,导致会出现SourceMap没初始化完成就有异常产生的情况。针对这种情况增加这行日志来提示开发者。eTS栈对应编译后产物中代码行号,可通过超链接跳转到对应错误代码行。

Generated by HiviewDFX@HarmonyOS
================================================================
Device info:xxxx
Build info:xxxx
Fingerprint:9851196f9fed7fd818170303296ae7a5767c9ab11f38fd8b0072f0e32c42ea39
Module name:com.xxx.xxx
Version:1.0.0.29
VersionCode:10000029
PreInstalled:Yes
Foreground:No
Pid:2780
Uid:20020018
Reason:TypeError
Error name:TypeError
Error message:Cannot read property needRenderTranslate of undefined
Stacktrace:
Cannot get SourceMap info, dump raw stack:at updateGestureValue (phone/src/main/ets/SceneBoard/recent/scenepanel/recentpanel/RecentGesture.ts:51:51)at onRecentGestureActionBegin (phone/src/main/ets/SceneBoard/scenemanager/SCBScenePanel.ts:5609:5609)at anonymous (phone/src/main/ets/SceneBoard/scenemanager/SCBScenePanel.ts:555:555)at anonymous (phone/src/main/ets/SceneBoard/recent/RecentEventView.ts:183:183)

Cannot get SourceMap info, dump raw stack 信息表示该应用为release包安装,JS栈转换eTS行列号失败,可考虑使用应用堆栈解析来解析行号。

应用堆栈解析

将报错信息直接使用ide查看,选择DevEco Studio底部log选择AnalyzeStackTrace,选择Source map、So、Name cache,点击start,右侧就会把ts对应的ets代码映射关系出来。
ide解析行号
或者使用三方网站 https://www.murzwin.com/base64vlq.html,将BaseEncode的报错,decode解析出来,效果是这样的,把ts的行列信息映射到ets中。
解析结果

sourceMaps和nameCache分别在下面的勾对号和红框里面的,文件是一样的,可能是针对不同使用方使用的。所以在打APP包产物的时候要备份sourceMaps和nameCache文件,就是为了转换报错信息使用的。sourceMaps是解决行列信息,nameCache主要是为了解混淆文件使用的。
在这里插入图片描述

总结

通过上面我们很清楚的知道鸿蒙中故障分类和产生的原因、以及产生故障的代码应用层位置,我们就可以很容易去解决以上问题,从而降低线上的崩溃率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分析K8S中Node状态为`NotReady`问题

在Kubernetes(k8s)集群中,Node状态为NotReady通常意味着节点上存在某些问题,下面为你分析正常情况下节点应运行的容器以及解决NotReady状态的方法。 正常情况下Node节点应运行的容器 1. kubelet kubelet是节点上的核心组件&…

第六届机电一体化技术与智能制造国际学术会议(ICMTIM 2025)

重要信息 4月11-13日 南京江北新区工业大学亚朵酒店 www.icmtim.org(点击了解参会投稿等) 简介 由南京工业大学主办,南京工业大学电气工程与控制科学学院、中国矿业大学、黑龙江大学、江苏省自动化学会承办的第六届机电一体化技术…

INT202 Complexity of Algroithms 算法的复杂度 Pt.2 Search Algorithm 搜索算法

文章目录 1.树的数据结构1.1 有序数据(Ordered Data)1.1.1 有序字典(Ordered Dictonary)1.1.1.1 排序表(Sorted Tables) 1.2 二分查找(Binary Search)1.2.1 二分查找的时间复杂度 1.3 二叉搜索树&#xff0…

【AVRCP】蓝牙链路控制器(LC)与AVRCP互操作性要求深度解析

目录 一 、Link Controller(LC)概述 1.1 LC的定义与功能 1.2 LC在蓝牙技术中的重要性 二、Link Controller(LC)互操作性要求 2.1 互操作性要求概述 2.2 物理层互操作性要求 2.3 链路管理互操作性要求 2.4 其他互操作性要求…

高级背景抠图工具(python)

这是一个专业的图像背景处理工具,基于Python开发,主要功能包括:1. 智能背景去除 - 使用rembg库的深度学习模型自动识别并移除图片背景。 2. 背景自定义 - 支持纯色背景替换,保留透明通道(Alpha通道)。3. 高级参数调节 - 提供5种专业级图像处理参数。4. 实时预览 - 双窗口…

如何设计外贸邮件开发信主题

开发信是打开客户大门的第一步,而邮件主题则是决定客户是否打开邮件的关键。一个吸引人的主题不仅能提高打开率,还能为后续沟通打下良好基础。 一、突出价值和利益 邮件主题要直接传达收件人能从中获得的价值和利益,引起他们的兴趣和关注。…

wordpress表单插件CF7调用方式

Contact Form 7(CF7)是WordPress中非常流行的表单插件,以下是其常见的调用方式: 通过短代码调用 在页面或文章编辑器中添加:完成表单设置后,复制表单对应的短代码,然后在需要显示表单的页面或文章的编辑器中直接粘贴…

快速入手-基于Django的主子表间操作mysql(五)

1、如果该表中存在外键,结合实际业务情况,那可以这么写: 2、针对特殊的字典类型,可以这么定义 3、获取元组中的字典值和子表中的value值方法 4、对应的前端页面写法

网络运维学习笔记(DeepSeek优化版) 021 HCIA-Datacom新增知识点03园区网典型组网架构及案例实战

文章目录 园区网典型组网架构及案例实战1 园区网定义2 园区网络典型架构3 各层级协议与技术4 项目生命周期管理5 小型园区网络设计框架5.1 组网方案设计5.2 IP地址规划5.3 园区内部的路由设计5.4 NAT设计5.5 WLAN设计5.6 安全设计5.7 运维管理设计 6 小型园区的实施方案与运维手…

1.8 函数的连续性和间断点

1.连续的定义 2.间断点的定义 3.间断点的分类

基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法

基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法 已经弃用的版本(Version 10.3-2021.10):gcc-arm-none-eabi:https://developer.arm.com/downloads/-/gnu-rmArm GNU Toolchain当前版本:https://developer.a…

希尔排序中的Hibbard序列

一 定义 Hibbard序列的每个元素由以下公式生成: h_k = 2^k - 1 其中k从1开始递增,序列为:1, 3, 7, 15, 31, 63, … 二 生成方式 起始条件:k=1,对应h_1=2^1-1=1 递推公式:每次k增加1,计算 h_{k+1}=2^{k+1}-1 示例:前5项…

失败的面试经历(ʘ̥∧ʘ̥)

一.面向对象的三大特性 1.封装:将对象内部的属性私有化,外部对象不能够直接访问,但是可以提供一些可以使外部对象操作内部属性的方法。 2.继承:类与类之间会有一些相似之处,但也会有一些异处,使得他们与众…

算法及数据结构系列 - 二分查找

系列文章目录 算法及数据结构系列 - BFS算法 文章目录 二分查找框架思路经典题型二分查找寻找左侧边界寻找右侧边界 刷题875. 爱吃香蕉的珂珂1011. 在 D 天内送达包裹的能力392. 判断子序列 二分查找 框架思路 int binarySearch(int[] nums, int target) {int left 0, righ…

SpringBoot的启动原理?

大家好,我是锋哥。今天分享关于【SpringBoot的启动原理?】面试题。希望对大家有帮助; SpringBoot的启动原理? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Boot的启动原理主要是通过 SpringApplication 类来…

代码随想录第55期训练营第八天|LeetCode344.反转字符串、541.反转字符串II、卡码网:54.替换数字

前言 这是我参加的第二次训练营!!!爽!这次我将更加细致的写清每一道难题,不仅是提升自己,也希望我自己的写的文章对读者有一定的帮助! 打卡代码随想录算法训练营第55期第八天(づ&a…

Json的应用实例——cad 二次开发c#

以下是一个使用AutoCAD C#.NET API实现你需求的示例代码,代码实现了提示用户选择一个实体,将一些字符串变量及其对应的值组成JSON格式数据存储到实体的扩展数据(XData)中,并在弹出窗口中显示该实体的所有扩展数据信息。…

Springboot的jak安装与配置教程

目录 Windows系统 macOS系统 Linux系统 Windows系统 下载JDK: 访问Oracle官网或其他JDK提供商网站,下载适合Windows系统的JDK版本。网站地址:Oracle 甲骨文中国 | 云应用和云平台点击进入下滑,点击进入下载根据自己的系统选择&…

Python与区块链隐私保护技术:如何在去中心化世界中保障数据安全

Python与区块链隐私保护技术:如何在去中心化世界中保障数据安全 在区块链世界里,透明性和不可篡改性是两大核心优势,但这也带来了一个悖论——如何在公开账本的同时保障用户隐私?如果你的交易记录对所有人可见,如何防止敏感信息泄露? Python 作为区块链开发中最受欢迎的…

通俗详解redis底层数据结构哈希表之渐进式rehash

一、为什么要用渐进式rehash? 假设你家的旧柜子(哈希表)装满了,需要换个大柜子。如果一次性把所有东西倒腾到新柜子,你可能得停下手头所有事,累得半死(这就是传统rehash的问题:卡顿…