Skip to content

启动即 100% CPU 卡死,UI 完全无响应 #427

Description

@abigmiu

描述

打开 codeg (复测到 0.23.5/0.23.3)后 UI 立即卡死、转圈。主进程 codeg 无响应,被占满 CPU 的是 WebKit 的 com.apple.WebKit.WebContent 子进程(kill 后立刻新起一个并以 100% CPU 继续跑,重新复现)。应是 Tauri v2 (WKWebView) 的 webview 渲染进程无限循环导致。

环境

  • macOS 15.7 (24G222),x86_64
  • Hardware: Intel iMac Pro (i5-12600KF, 32GB)
  • codeg 版本: 0.23.5 (0.23.3 也复现)
  • 与网络无关:启动时页面仍在本地加载阶段即触发

复现步骤

  1. 打开 codeg.app
  2. 等几秒,UI 卡死、转圈,系统 com.apple.WebKit.WebContent 进程 100% CPU(连续多次采样一致)

根因分析(从多次采样/诊断报告得出)

100% CPU 全部集中在 WebContent 主线程 CFRunLoop 的 timer 回调,堆栈每次采样都完全一致,判定为前端 JS 的 ResizeObserver 回调死循环(无限同步重排)

CFRunLoopRun → WebCore::timerFired
→ WebKit::RemoteLayerTreeDrawingArea::updateRendering
→ WebCore::Page::updateRendering()
→ Document::updateResizeObservations()
→ ResizeObserver::deliverObservations()
→ WebCore::JSResizeObserverCallback::handleEvent()
→ JSC::profiledCall → invoke JS(大量 unknown JS 帧)

即:resize 观察回调 → 修改 DOM 尺寸 → 再次 resize 观察触发 → 无限循环;同时伴随 stringProtoFuncIncludes 等高耗时调用。怀疑聊天/编辑器类 DOM(代码渲染、diff、自动布局)中某组件的 resize 逻辑写成了「改尺寸 → 又触发 resize → 再改」的自循环,WebKit 侧无法中断。

辅助线索

  • 系统 cpu_resource 诊断报告:Resource Coalition 明确标注 app.codeg,事件 cpu usage,90s 内 CPU 100%(阈值 50% / 180s)。
  • 另一条诊断:codeg 主进程在 8.7h 内写盘 34.36GB(平均 1084KB/s),日志线程 tracing_appender worker → write 疯狂滚动写日志,与这个卡死放大现象一致。

裁剪信息

  • 无日志文件,system log 无相关条目
  • 已尝试:最新版(0.23.5)更新后依然复现

配置

== system ==
ProductName: macOS
ProductVersion: 15.7
BuildVersion: 24G222
Darwin iMac-Pro.local 24.6.0 Darwin Kernel Version 24.6.0: Mon Aug 11 21:16:05 PDT 2025; root:xnu-11417.140.69.701.11~1/RELEASE_X86_64 x86_64
12th Gen Intel(R) Core(TM) i5-12600KF
34359738368
16
== codeg version ==
0.23.5

附件

WebContent_sample_live.txt

WebContent_cpu_2026-08-08.txt

WebContent_cpu_2026-08-08-1002.txt

codeg_writes_2026-08-07.txt

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions