## 诊断流程样例:浏览器插件卡死性能诊断器
### 输入
| 字段 | 示例 |
|---|---|
| 浏览器 | 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 映射到其他标签页/扩展。结论是本轮卡死不是无痛英语主因,转查页面自身脚本或其他扩展。