ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【DFX系列】Flutter 鸿蒙日志与Trace抓取使用指南

【DFX系列】Flutter 鸿蒙日志与Trace抓取使用指南 通过上一篇我们打了个基础今天的这一篇会作为日志专项重点带你详细解说日志在DFX中的重要作用并一步步教你怎么用一、日志从哪来Flutter 鸿蒙中的日志来自三个源头来源Tag典型内容引擎内部(FML_LOG)映射到 HiLog崩溃堆栈、卡死检测、GPU 回收平台 C 层XComFlutterOHOS_Native引擎初始化、NAPI 调用ETS 嵌入层FlutterMethodChannel、插件异常、生命周期如果你不确定要看哪个源头用一条命令查看全部hdc shell hilog | grep -E Flutter|XComFlutter|flutter其中命令里的三个关键字的大小写不同分别对应 ETS 层、平台 C 层和引擎内部的命名习惯拼在一起才不缺失信息。二、怎么抓日志2.1 基本流程分为四步不管什么问题先按四步把日志抓下来# 1. 清空历史日志,只留复现后的新日志 hdc shell hilog -r # 2. 复现问题(操作应用,触发 bug) # 3. 抓取日志,CtrlC 停止 hdc shell hilog flutter_log.txt # 4. 筛选 Flutter 相关内容 hdc shell hilog | grep -E Flutter|XComFlutter|flutter flutter_filtered.txthilog 是鸿蒙的日志系统类似 Android 的 logcat。grep 是文本搜索工具-E 表示按正则表达式匹配表示把输出保存到文件。先清空再复现日志里只有本次问题的记录搜索范围小得多。2.2 实时监控边操作边看不带输出重定向命令就变成实时流按问题方向选一条挂着同时操作应用:# 实时看全部 Flutter 日志 hdc shell hilog | grep -E Flutter|XComFlutter|flutter # 实时看崩溃日志 hdc shell hilog | grep -E Caught signal|Unhandled exception|FLUTTER_ # 实时看卡死日志 hdc shell hilog | grep -E FlutterWatchdog|not alive|HiCollie # 实时看 GPU 回收日志 hdc shell hilog | grep -E GpuReclaim|Surface # 实时看外接纹理日志 hdc shell hilog | grep -E external_texture|NativeImage|texture_id2.3 抓到设备文件再拉回到电脑如果复现时间不好预估时可以先把日志落在设备上完事后再拉取# 把日志保存到设备文件 hdc shell hilog /data/local/tmp/flutter_log.txt # 拉取到电脑 hdc file recv /data/local/tmp/flutter_log.txt ./flutter_log.txt2.4 崩溃专用tombstoneNative 崩溃时系统会在/data/log/faultlog/下生成 tombstone 文件信息比 hilog 详细这也是必知必会的常识# 查看崩溃日志文件 hdc shell ls /data/log/faultlog/ # 拉取到电脑 hdc file recv /data/log/faultlog/faultlog-xxx ./faultlog.txt2.5 卡死专用APP_FREEZEUI 线程卡死 6 秒系统生成 APP_FREEZE 事件同样落在 faultlog 目录dc shell ls /data/log/faultlog/ hdc file recv /data/log/faultlog/appfreeze-xxx ./appfreeze.txt三、过滤日志四个维度3.1 按问题类型(最常用)按现象对照选命令噪音少很多:3.2 按 Tag 过滤只关心一个源头时用-T比 grep 快# 只看引擎 C 日志 hdc shell hilog -T XComFlutterOHOS_Native # 只看 ArkTS 日志 hdc shell hilog -T Flutter3.3 按级别过滤hilog 的级别参数控制输出门槛hdc shell hilog -b D # 全部日志(Debug 及以上) hdc shell hilog -b I # 只看 Info 及以上 hdc shell hilog -b W # 只看 Warn 及以上 hdc shell hilog -b E # 只看 Error 及以上五个级别的含义和用途:级别通俗理解什么时候看DEBUG最详细的调试信息开发调试时INFO关键流程节点确认流程是否正常WARN警告,可恢复的问题检查潜在问题ERROR错误,功能失败排查问题FATAL致命,不可恢复必须修复排查问题时建议开启 DEBUG 级别:hdc shell hilog -b D。默认级别会把大量引擎细节拦在门外。3.4 组合过滤技巧四个常用组合,覆盖大部分缩小范围的需求:# 多个关键词,OR 关系 hdc shell hilog | grep -E GpuReclaim|frame gate|Surface REBUILT # 排除噪音,NOT 关系 hdc shell hilog | grep -E Flutter | grep -v flutter:: # 只看某个时间段:10:30-10:35 的日志 hdc shell hilog | grep 08-03 10:3[0-5] # 统计关键词出现次数:卡死了几次 hdc shell hilog | grep -c is not alivegrep -v排除、grep -c计数,这两个用得最少,卡死类问题统计复现次数时最省事。四、Release 模式下 ETS 日志看不到怎么办?Release/Profile 模式默认只输出 WARN 及以上,看不到详细日志。需要在应用入口把级别调回 DEBUG​​​​​​​import Log from ohos.flutter.ohos/src/main/ets/util/Log; Log.setLogLevel(HiLog.LogLevel.DEBUG);改完后需要重新打包。这个开关只影响 ETS 嵌入层的日志,引擎 C 层的日志级别由 3.3 节的-b参数控制。五、HiTrace性能调优专属HiTrace 是性能追踪工具记录每一帧的耗时类似 Chrome DevTools 的 Performance 录制。日志看不出卡顿原因时就需要切换为 Trace了。抓 10 秒 Trace,在这 10 秒内复现问题:hdc shell hitrace --trace_clock boottime -t 10 flutter -o /data/local/tmp/trace.ftrace hdc file recv /data/local/tmp/trace.ftrace ./trace.ftrace # 方法1用 Chrome 打开:访问 chrome://tracing,点 Load,选文件 # 方法2使用HiSmartPerf怀疑线程被调度问题拖住时把调度信息一起抓(时长放到 30 秒):hdc shell hitrace --trace_clock boottime -t 30 flutter sched -o /data/local/tmp/trace.ftraceTrace 打开后,按这张表搜索:搜索关键词看什么正常表现flutter::Frame每一帧的耗时低于 16msFlutter Lost Frames丢帧计数值为 0Flutter Hitch Time丢帧详情不出现feedFlutterWatchdogUI 线程心跳每 3 秒一次feedFlutterRasterWatchdogRaster 线程心跳每 3 秒一次两条心跳是卡死排查的锚点心跳还在线程活着心跳断了,去数最后一次心跳之后发生了什么。这里以HiSmartPerf性能调优工具为例Expected Timeline理想帧泳道图。Actual Timeline真实帧泳道图。可以通过看到子线程的调用关系举例六、关键日志速查(按严重程度)日志到手后按类别搜关键字。同一行里,严重程度决定了处理的优先级:崩溃相关关键字含义严重程度Caught signal SIGSEGV引擎访问了非法内存致命Caught signal SIGABRT引擎断言失败或堆破坏致命Unhandled exceptionDart 代码有未捕获异常致命Failed to handle method callETS 插件异常中卡死相关关键字含义严重程度is not alive某个线程卡死了致命m_is_six_second_event false卡死 3 秒,第一阶段严重m_is_six_second_event true卡死 6 秒,第二阶段,可能弹窗致命thread may be blocked, do not report防误报跳过正常内存 / GPU 相关关键字含义严重程度Dart heap memory usage exceeds thresholdDart 内存超 1.5GB高GpuReclaim kAggressiveGPU 资源被回收正常(退后台时)GpuReclaim kRestoreGPU 资源恢复正常(回前台时)Surface REBUILTSurface 重建成功正常SetDisplayWindow failedSurface 重建失败异常外接纹理相关关键字含义严重程度No DlImage available无可绘制画面,黑屏中frame gate enabled后台帧闸门开启正常skip one frame(slow consumer)消费过慢跳帧中PlatformViewVisibleAreaEventCallback可见区域变化—Vsync 相关关键字含义严重程度vsync_handle_ is nullptrVsync 句柄无效致命AwaitVSync…failedVsync 请求失败致命Failed to dlopen libnative_vsync.soVsync 库加载失败致命七、常见问题Q1:抓不到 Flutter 日志原因解决方法日志级别没开hdc shell hilog -b Dhilog 服务没运行hdc shell hilog -v查状态hdc shell hilog -r清空重试设备没连接hdc list targetsQ2:HiAppEvent 事件在哪里看?三个入口从轻到重# 方法 1:搜索上报日志 hdc shell hilog | grep OH_HiAppEvent_Write # 方法 2:搜索特定事件 hdc shell hilog | grep -E FLUTTER_DART_EXCEPTION|OTHER_JANK|FLUTTER_STABILITY_EVENT # 方法 3:查看 faultlog 目录 hdc shell ls /data/log/faultlog/Q3:HiAppEvent 事件上报失败?错误日志含义解决方法API version too low系统 API 太低需 API 18reportFrameworkMemAnomaly_ is nullptr内存上报 API 不足需 API 26flush isValid_ falseHiAppEvent 没初始化检查 SO 库加载Q4:怎么确认日志属于哪个线程?搜索关键词对应线程FlutterUiThread / feedFlutterWatchdogUI 线程FlutterRasterThread / feedFlutterRasterWatchdogRaster 线程FlutterPlatformThread / feedFlutterPlatformWatchdogPlatform 线程下一篇是Crash相关的专项大家期待下~小伙伴们记得点赞关注CPF-Flutter社区官网https://atomgit.com/CPF-Flutter“AI再牛技术不能丢”
返回列表