鴻蒙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.pswp.cn/web/72920.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72920.shtml
英文地址,請注明出處:http://en.pswp.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的問題:卡頓…