开发态快速定位Freeze 📅 2026/7/9 7:11:24 本原创文章帖发布在华为开发者联盟社区欢迎开发者前往访问评论交流更多与该内容相关讨论请点击原帖查看开发态快速定位Freeze-华为开发者话题 | 华为开发者联盟1.1 AppFreeze冻屏分析流程与高频场景当应用发生冻屏时用户通常会遇到以下现象1.界面无响应应用界面点击无效、画面静止、无法响应用户操作如滑动、点击按钮等。2.系统弹窗提示持续一段时间通常为3-6秒后系统可能弹出“应用未响应”对话框提示用户等待或关闭应用。3.应用闪退或强制终止若冻屏状态持续系统为保障整体流畅度可能会强制终止该应用进程导致应用闪退。4.日志特征在系统或应用日志中会出现特定的故障类型关键字如 THREAD_BLOCK_6S应用主线程冻屏超时、APP_INPUT_BLOCK用户输入响应超时。1.1.1 THREAD_BLOCK_6S应用主线程冻屏超时THREAD_BLOCK_6S 应用主线程冻屏超时触发条件• 如果判活检测任务超过3秒未被主线程执行系统会上报 THREAD_BLOCK_3S警告事件并抓取一次瞬时堆栈Warning栈。• 如果判活检测任务超过6秒仍未被主线程执行系统则判定主线程已冻屏上报 THREAD_BLOCK_6S主线程冻屏事件并抓取最终堆栈Error栈。• 两个事件匹配后系统会生成完整的应用冻屏日志并通常会导致应用被强制终止。•根本原因这表明应用主线程被长时间阻塞无法处理新任务。常见原因包括在主线程执行耗时计算、同步网络请求、大文件IO、复杂UI渲染、死锁、或消息队列因高优先级任务过多导致watchdog任务无法被及时调度等。1.1.2 APP_INPUT_BLOCK用户输入响应超时APP_INPUT_BLOCK 用户输入响应超时•触发条件如果应用侧的回执超时系统即判定为用户输入响应超时上报 APP_INPUT_BLOCK故障。•根本原因由于主线程繁忙或阻塞无法及时处理输入事件所致。1.2 标准化排查流程冻屏检测会生成故障日志其中包含冻屏堆栈3s warning栈和6s error栈。1. 获取冻屏日志通过DevEco Studio的底部FaultLog模块或触发冻屏现象时DevEco Studio右下提示框直接跳转至FaultLog。2. 查看信息分析故障类型进入Fault Analysis页签查看Freeze type• THREAD_BLOCK_6S应用主线程冻屏超时前台6秒后台21秒。• APP_INPUT_BLOCK用户输入响应超时。3. 解析堆栈信息查看3s/6s Compare对比3秒warning和6秒error的堆栈对非THREAD_BLOCK_6S类型的App冻屏问题则分析消息队列。根据3s/6s堆栈一致则推断是主线程阻塞不一致则主线程繁忙4. 分析主线程堆栈查看Sampling Stack定位到故障指向结合指向的业务路径和系统负载信息推断导致主线程繁忙/阻塞的业务代码逻辑并优化修复。1.2.1 冻屏分析案例案例背景用户在操作应用时如点击按钮、滑动屏幕、按键应用界面完全无反应仿佛“冻结”了一般。持续等待约5秒后应用进程被系统终止或弹出“应用无响应”提示框。1.2.2 分析流程1.2.2.1 配置获取App冻屏增强日志查看采样栈数据之前需要在AppScope/app.json5文件中配置如下环境变量获取App冻屏增强日志。appEnvironments: [ { name: DFX_APPFREEZE_LOG_OPTIONS, value: mainthread_sampling:enable } ]1.2.2.2 查看FaultLog打开FaultLog窗口双击app冻屏日志查看faultlog头部的Event、Timestamp及Reason字段可以初步定位场景1.2.2.3 查看Fault AnalysisFault Info右侧会出现Fault Analysis页签点击Fault Analysis页签会展示结构化的日志信息。查看Freeze type 确认场景为THREAD_BLOCK_6S主线程卡死超时对比3秒warning和6秒error的堆栈• 3秒和6秒的栈不一致说明线程仍在执行业务代码可能是任务过重导致主线程繁忙需结合采样栈进一步确认。1.2.2.4 分析Sampling Stack步骤4分析Sampling StackSampling Stack页签展示应用堆栈绿色标识和系统堆栈蓝色标识点击切换图表类型按钮可切换到堆栈火焰图并通过不同颜色标识堆栈类型其中红色代表异常堆栈图中异常堆栈指向业务page结合前面步骤3s/6s堆栈不一致的场景此时需要定位page中导致主线程繁忙的业务逻辑。进入对应业务代码查看发现存在两处严重导致主线程业务繁忙的问题。1. 这是一个空循环在主线程上持续运行 3秒循环体内没有任何操作纯粹占用CPU资源在此期间主线程完全被阻塞无法响应任何UI事件、触摸输入或渲染更新。2. 超大规模的同步I/O操作1.2.2.5 优化修复优化修复1. 移除忙等待循环2. 使用异步API替代同步API3. 根据实际需求设置合理的循环次数1.3 附录 常见修复建议根据问题特征冻屏根因可分为以下几类1. 应用代码问题如执行耗时函数、内存泄漏导致频繁GC、高优先级任务过多。优化方法包括将耗时操作移至子线程、减少内存泄漏、合理控制任务优先级。2. 死锁问题堆栈显示持锁等待。需检查代码中的锁使用避免循环等待。3. 调度问题trace显示主线程长时间runnable。需调整任务优先级或联系调度域协助。4. 系统库或IO问题堆栈卡在系统库调用或IO操作。需排查系统库接口的耗时或IO阻塞情况。