HarmonyOS鸿蒙Next JSCrash 排查经验——TypeError、ReferenceError、BusinessError 频现,你们是怎么从 faultlogger 日志快速定位到代码行的?

HarmonyOS鸿蒙Next JSCrash 排查经验——TypeError、ReferenceError、BusinessError 频现,你们是怎么从 faultlogger 日志快速定位到代码行的? 日志里没有明确标记崩溃发生在应用启动阶段还是用户操作阶段。启动阶段的崩溃通常更严重(可能是环境问题),但混在一起很难统计各自的占比。你们是在代码层面加了标记,还是通过日志时间戳和 session 信息推断?

7 回复

更多关于HarmonyOS鸿蒙Next JSCrash 排查经验——TypeError、ReferenceError、BusinessError 频现,你们是怎么从 faultlogger 日志快速定位到代码行的?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


FaultLog

当应用运行发生错误导致应用进程终止时,应用将会抛出错误日志以通知应用崩溃的原因,开发者可通过查看错误日志分析应用崩溃的原因及引起崩溃的代码位置。

FaultLog由系统自动从设备进行收集,包括如下几类故障信息:

faultlogger 里先把 JS 异常和 native crash 分开看。TypeError/ReferenceError 更关注 JS stack 顶部业务函数、异步边界和 release 后的 source map;BusinessError 要同时看 code、message、触发 API 和设备 API level,不要只看最后一行。

实践上建议统一封装关键 async/await、回调和生命周期入口,记录脱敏后的 error.name、message、stack、业务场景和版本号。线上包如果压缩混淆了,需要保留对应版本 source map,否则 faultlogger 给出的行列号很难稳定还原到源码。

Debug试试,

没弄过。,

在faultlogger日志中搜索“JSCrash”及错误类型(TypeError等),关注stack字段,其包含JavaScript调用栈,格式为“文件名:行号:列号”。使用hilog命令过滤js堆栈:hilog -x | grep JSCrash。也可通过DevEco Studio的Log面板筛选“faultlog”,点击堆栈行跳转源码。若日志缺失行号,启用sourceMap(release版本需上传至华为AGC)。

在 HarmonyOS Next 中,faultlogger 会直接捕获 JS 异常并输出调用栈,通常包含源文件路径、行号和列号,如 at func (entry/src/main/ets/pages/Index.ets:42:20),所以几乎可以立刻定位到崩溃代码行,不需要额外解析。

对于缺少“启动/操作阶段”标识的问题,我们的做法是:

  • 用时间戳和进程 PID 推断:faultlogger 日志中带有进程 PID 和崩溃时间。在同一进程内,把最早的一条 JS 帧时间与 Ability 启动日志(如 onCreateonWindowStageCreate 打出的时间戳)对比,差值在几百毫秒内的就是启动阶段崩溃,其余归为用户操作阶段。
  • 在代码中埋点标记:在应用入口 (onCreate) 和首个页面 onPageShow 结束时用 hilog.info 输出固定 tag,解析日志时自动匹配这些标记来划分阶段,统计时更准确。

这两种方式结合就能快速区分占比,无需侵入业务逻辑。

回到顶部