1 关键字

jscrash;aboutToBeDeleted;属性未定义

2 问题描述

设备版本:3.2Release

使用wukong进行随机测试,在测试过程中出现大量发生在TS生命周期函数aboutToBeDeleted中的jscrash,问题栈名均为aboutToBeDeleted,挑选其中一个jscrash如下图:

img

3 问题原因

3.1 正常机制

使用wukong工具进行随机测试,TS生命周期函数aboutToBeDeleted不会抛出jscrash异常,测试全部通过。

3.2 异常机制

使用wukong进行随机测试,在测试过程中出现大量发生在TS生命周期函数aboutToBeDeleted中的jscrash,问题栈名均为aboutToBeDeleted,挑选其中一个jscrash如下图:

img

源码:

img

4 解决方案

在执行aboutToBeDeleted函数之前,对其对应的js对象进行是否未定义的判断,修改方案如下图:

img

5 定位过程

1.首先根据通过jscrash问题定界脚本将该jscrash文件进行解析,解析后获取到对应报错应用名:com.ohos.settings 以及问题栈名:aboutToBeDeleted;

img

2.根据栈名发现是TS生命周期函数aboutToBeDeleted下的异常,因此去查找对应的js代码行,通过错误信息:read property __appInfo of undefined大致定位是因为__appInfo未定义导致抛异常,再进一步看该代码行,__appInfo是this所调用,因此得出结论是因为this未定义导致__appInfo未定义。

img

3.因此需要在执行aboutToBeDeleted函数前判断js对象是否已定义。

6 知识分享

ets编译后生成的js文件中会有一个生命周期函数:aboutToBeDeleted,该函数是在页面销毁时触发,函数中会对组件的相关属性进行删除销毁操作,但在极低概率下,调用此函数前,js对象本身已经销毁,this不存在,在调用其属性时,会抛出属性未定义的错误,需要底层在调用aboutToBeDeleted前,对js对象做是否未定义的判断。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐