目录

启动应用时发生闪退

问题现象

用户点击应用图标打开应用,打开过程中应用发生闪退。

背景知识

应用打开发生闪退,主要是发生了JS Crash异常或者CppCrash异常所导致。

该类异常的一般定位思路为:

  1. 通过问题发生的时间,找到faultlogger目录对应的JS Crash日志文件。
  2. 通过日志文件中以Reason:开头的行,找到对应的关键字,确定当前故障归属的具体场景。
  3. 根据异常的关键字在下表中检索应用发生JS Crash/CppCrash的原因,完成定界。

场景一

[h2]问题定位

打开对应日志查看内容,确定故障原因是ReferenceError。

[h2]分析结论

[h2]修改建议

场景二

[h2]问题定位

故障原因是TypeError:

从异常信息可以看出,变量不是预期的类型。

[h2]分析结论

[h2]修改建议

场景三

[h2]问题定位

故障原因是Error:

[h2]分析结论

非法参数抛出异常,应用未处理异常导致闪退。

[h2]修改建议

对异常入参进行错误处理。

场景四

[h2]问题定位

故障原因是BusinessError:

[h2]分析结论

未处理业务错误抛出的异常导致应用闪退。

[h2]修改建议

参考堆栈轨迹分析解析堆栈后结合具体代码进行分析,在异常抛出位置使用try-catch捕获并处理异常。

场景五

[h2]问题定位

故障原因是SyntaxError:

[h2]分析结论

字符串的格式不符合JSON语法规范。

[h2]修改建议

检查字符串是不是非JSON格式或者包含特殊字符。

场景六

[h2]问题定位

故障信号是SIGSEGV(SEGV_MAPERR):

[h2]分析结论

无效内存访问,访问空指针。

[h2]修改建议

栈顶so库使用hstack解析崩溃栈后结合具体代码进行分析,排查是否访问了空指针,在访问变量前进行非空校验。

场景七

[h2]问题定位

故障信号是SIGABRT(SI_TKILL):

[h2]分析结论

[h2]修改建议

场景八

[h2]问题定位

故障信号是SIGILL(ILL_ILLOPC):

[h2]分析结论

非法操作码异常,需栈顶so库解析崩溃栈后结合代码进行具体分析。

[h2]修改建议

结合崩溃栈解析结果和具体代码排查是否执行不被CPU支持的指令,或者尝试执行特权指令。