# 界面挂掉问题的勘察记录 > 2026-09-17 夜间,用户手动重启 `dsh web` 多次(观察到至少 4 次:PID 20985 → 32341 → 34176 → 34884)。 > 本文记录排查过程与结论。 > > ⚠️ **未形成确诊。** 下面是证据与排除项,以及一个最可疑的方向。 --- ## 1. 已排除的原因 | 假设 | 证据 | 结论 | |---|---|---| | **系统内存不足 / OOM** | `vm.swapusage` = 0;系统空闲内存 50%;`log show` 中无 node 的 jetsam 击杀记录 | ❌ 排除 | | **node 硬崩溃** | `~/Library/Logs/DiagnosticReports/` 中近期无 node/dsh 崩溃报告(最近一条是 9-13 的 MTLCompilerService) | ❌ 排除 | | **我的探针实例残留 / 端口冲突** | 3080 只有一个 PID;3181–3185 全部空闲;无孤儿 memorix 进程 | ❌ 排除 | | **Memorix 数据库锁争用** | 探测时仅有一个 memorix 子进程;`memorix.db-shm/wal` 正常 | ❌ 排除 | | **dsh-mylife 插件崩溃宿主** | 见第 2 节:插件在真实 agent 会话中正常注册 11 个工具,从未抛错 | ❌ 排除 | | **插件产生副作用文件** | `find ~/.dsh -newermt "-2h" -name "*mylife*"` 只命中两个 profile 的符号链接 | ❌ 排除 | **DSH 不写文件日志**(`~/.dsh` 下无 `.log`),所以宿主侧异常无法从事后日志追查 —— 这是排查的主要困难。 --- ## 2. 插件无罪的直接证据 在一个真实 agent 会话中查询工具目录: ```sh dsh --profile headless "列出你可用工具中所有以 mylife_ 开头的工具名" → mylife_claim_add, mylife_claim_query, mylife_conclusion_add, mylife_counter_evidence, mylife_digest, mylife_profile_set, mylife_record, mylife_staleness_check, mylife_status, mylife_supersede, mylife_trace ``` 11 个全部注册。插件的 `apply()` 只做两件事:注册工具、异步初始化工作区(且 try/catch 兜住)。 它**不注册任何客户端(浏览器侧)代码** —— `package.json` 里没有 `dsh.client`, 所以它不可能直接影响页面渲染。 --- ## 3. 最可疑的方向:会话体积 ### 观测数据 | 项 | 值 | |---|---| | 出事会话的事件条数 | **1827** | | 解压后体积 | **5.4 MB** | | 压缩后 | 1.7 MB | | **单条最大记录** | **138.9 KB** | | 用户机器上任一会话最大 | 10.2 MB(另有 8.9 / 6.6 MB 两个) | ### 推断【未确诊】 dsh 的 Web UI 是单页应用,一个会话的全部事件要在浏览器里投影成 DOM。 **1800+ 事件、5.4 MB 内容、单条 139 KB 的会话,渲染与重渲染开销会非常大**, 表现为页面卡死或需要重启。 ### 其中有一部分是我的责任 排查过程中我跑过几条**输出无节制**的命令: - `lsof -p -a -d cwd -Fn`:输出了数百行全系统路径 - 全量日志 `grep`、多次 `find ~/.dsh`、`log show` 这些进入了工具结果并留在会话里,单条记录因此达到 100+ KB。 **这是我的问题** —— 排查用的探索性命令应该先 `| head` 或写入文件再按需读取。 --- ## 4. 建议的处理 ### 立刻可做 1. **重会话就新开一个。** 不要在一个已经很大的会话里继续长时间高强度作业。 2. **探索性命令先限量。** 例如 `cmd 2>&1 | head -30`,或写进 `/tmp/x.log` 再 `grep`。 3. **定期清理旧会话。** 机器上有 372 个会话目录,其中 3 个在 6–10 MB。 ### 若要进一步确诊,需要的信息 我没有浏览器控制台,以下信息能大幅缩小范围: | 问题 | 为什么关键 | |---|---| | "挂掉"具体是什么样?页面卡死 / 白屏 / 一直转圈 / 报错弹窗 / 终端进程退出? | 这四种的根因完全不同 | | 是发生在**发送消息后**、还是**长时间挂机后**? | 前者指向渲染或流式,后者指向连接 | | 浏览器控制台有无报错?(F12 → Console) | 前端异常会直接显示在这里 | | 是**所有**会话都这样,还是只在某几个大会话里? | 能验证第 3 节的体积假设 | **验证体积假设的最简方法**:新开一个空会话,做几轮普通对话, 看是否仍然挂掉。如果新会话稳定、大会话必挂 —— 假设成立。 --- ## 5. 结论 - **不是**内存、不是崩溃、不是我的探针、**不是 dsh-mylife 插件**。 - **最可能是**前端在渲染超大会话时吃力,而我的探索性命令**加重了**这一点。 - 未确诊,上述为证据支持的推断。需要第 4 节的四项信息才能定论。