Replies: 2 comments
|
这个 我对 建议最小化时保持同一份离线复制的 profile、同一 DSH artifact 和同一 Session,只改变一个平面:
修复门禁应包含:写前比较 old/desired value、忽略自己生成的节点、缩小 observed root、dispose/session switch 时 disconnect、每帧/每秒扫描和写入上限,以及能保留导航的 session-level circuit breaker。 完整采集字段、构造栈探针、隐私边界和 16 项回归门禁整理在: 这是社区维护的源码分析,不代表官方已经确认根因。 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
环境
@deepseek-ai/dsh,npm 全局安装)现象
dsh web 页面完全卡死(无法点击、无法滚动、无法输入),
com.apple.WebKit.WebContent渲染进程 CPU 持续 95%+,物理内存 ~600-720MB。sample采样(1ms 间隔,2300+ 次)显示主线程 100% 时间卡在 MutationObserver 微任务循环,无一次空闲采样。核心调用栈(来自 sample 日志)
循环机制:JS 回调每次执行
document.querySelectorAll全文档扫描 + 修改文本节点(setNodeValue),修改产生新的 mutation 记录(enqueueMutationRecord)→ 微任务 checkpoint 再次触发回调 → 无限循环,主线程被占满。其他线程(libpas scavenger、Heap Helper、workqueue)全部正常等待(
__psynch_cvwait),不是死锁,是纯 CPU 忙循环。关键排查过程
cordis.patch.yml全部disabled: true,页面 HTML 确认无任何注入脚本)~/.dsh/sessions/<project>/移到sessions-archive/)结论
循环由特定会话内容触发,与插件无关。某个项目的会话(18 个会话全部归档后恢复)在渲染时触发前端 MutationObserver 反馈循环:React 重渲染 → DOM 变化 → 前端 observer 回调(
querySelectorAll+ 文本修改)→ 再次触发渲染 → 无限循环。复现线索
setNodeValue修改的是文本节点,回调里同时有hasAttribute/className/nodeName/parentElement/trim等密集 DOM 遍历操作建议
附件说明
test.txt:/usr/bin/sample采样日志(pid 60594,16:14 采样,1295 行),包含完整调用栈、热点统计、二进制镜像信息,可直接上传到讨论帖作为证据All reactions