## 诊断流程样例:浏览器插件卡死性能诊断器 ### 输入 | 字段 | 示例 | |---|---| | 浏览器 | Microsoft Edge | | 疑似扩展 | `无痛英语 - 生词标记` | | 扩展路径 | `/Users/bytedance/Documents/product-bu/20-products/viva/40-release/edge-extension-unpacked` | | 源码路径 | `/Users/bytedance/Documents/product-bu/20-products/viva/30-rd/anki-local-extension` | | 页面 | 当前卡死网站 URL 或本地最小复现 HTML | | 采样窗口 | 15 秒 | ### 执行 ```bash python /Users/bytedance/.codex/night-gym/tools/extension_perf_diagnostic.py \ --browser edge \ --extension-name "无痛英语 - 生词标记" \ --extension-path /Users/bytedance/Documents/product-bu/20-products/viva/40-release/edge-extension-unpacked \ --url "https://example.com/current-page" \ --sample-seconds 15 ``` ### 核心检查 | 阶段 | 成功信号 | 失败信号 | 下一步 | |---|---|---|---| | Renderer CPU 采样 | 找到持续高 CPU renderer,并记录 PID/CPU/命令行 | 没有高 CPU renderer 或采样波动太大 | 延长采样窗口,先不归因 | | PID 归因 | PID 能映射到具体 tab、extension 或 browser task | 只能看到 `Edge Helper (Renderer)` | 打开浏览器 task manager 或 CDP,再做归因 | | 扩展启用对照 | 禁用疑似扩展后 CPU 明显回落,重新启用后复现 | 禁用后 CPU 仍高 | 转查页面自身 JS、其他扩展或浏览器 profile | | Observer 指标 | mutation queue 能归零,added text node 与 walkTree 频率稳定 | added text node、walkTree、pending target 持续增长 | 查 `src/content.js` 动态内容处理与 guard | | Self DOM guard | tooltip/highlight/span 内部 text node 被跳过 | 插件自己创建的 DOM 又进入处理队列 | 修 `src/lib/extensionUiGuard.js` 并补回归测试 | ### 结论样例 `confirmed_extension_loop`: 高 CPU renderer 映射到目标页面;禁用 `无痛英语 - 生词标记` 后 CPU 从 100%+ 回落;debug snapshot 显示 added text node 与 `walkTree` 持续增长。结论是内容脚本动态处理触发自生成 DOM 循环,优先修 observer guard 和渲染期间暂停 observer。 `not_enough_attribution`: 系统采样看见 Edge renderer 100%+,但 PID 不能映射到目标扩展或页面。结论只能是浏览器卡死已复现,不能把责任归给 Viva;下一步先做 renderer 到 tab/extension 的映射。 `not_viva`: 禁用目标扩展后 CPU 仍高,或高 CPU renderer 映射到其他标签页/扩展。结论是本轮卡死不是无痛英语主因,转查页面自身脚本或其他扩展。