[Bug][Windows] dsh web 随机静默死亡:node-pty 1.2.0-beta.15 ConPTY socket 无 error 监听 + windowsTerminal 错误处理器 throw #4436
Replies: 3 comments
|
补充证据(同一台机器,第二次死亡):
|
|
Verified against rc.2 (HEAD b150a55) and the exact shipped node-pty artifact ( dsh side (rc.2)
node-pty internals (shipped
So it is not precisely "no listener at all" — it is a conditional listener (installed only on Family: this is the 4th member of the connection-lifecycle family I have been tracking (#4059 webserver upgrade-socket error listener removed during teardown over-cleanup → delayed ECONNRESET unhandled → crash; #4073 LSP stdout no error listener → crash; now #4436). Same invariant every time: a socket/stream whose Fix directions
|
|
太频繁了, 这样很难用啊 |
Uh oh!
There was an error while loading. Please reload this page.
Summary
Windows 上
dsh web服务器会随机静默死亡(GUI 显示Failed to fetch (internal),必须重启)。根因定位在依赖 node-pty 1.2.0-beta.15 的 ConPTY 命名管道 socket:没有挂'error'监听(输出端仅在ready_datapipe后才挂载)且windowsTerminal.js错误处理器里对非 EIO 错误直接throw err—— 任何一个路径都会产生未捕获异常,把整个 dsh web 宿主进程杀死(所有并行会话/子代理单点全灭)。Environment
0.1.1-rc.2(npm 全局安装 @deepseek-ai/dsh),web profile1.2.0-beta.15(dsh\node_modules\node-pty)Symptom
-1073741819(0xC0000005访问违规,原生层)。Evidence
启动器捕获的进程死亡实录(02:22:13,退出码 1):
另一个运行实例(存活 3 小时)退出码为
-1073741819(0xC0000005,原生访问违规),同样无任何日志输出。此前的"静默死亡"(监视器每 15s 探测:进程从
http=200直接变为NO LISTENER)同样可以在同一时刻的会话文件上看到:多个并行会话的最后一次写入时间完全一致(01:55:43.79),即所有 agent 回合被同一瞬间杀死。Code analysis (node-pty 1.2.0-beta.15)
调用链:标准预设挂载的持久化 bash/pwsh 工具(
dsh-tool-pwsh-persistent/dsh-tool-bash-persistent)→dsh-terminal-bash→dsh-subprocess-local.spawnTerminal→nodePty.spawn(...)(ConPTY)。lib/windowsPtyAgent.js构造函数(约 56-93 行):lib/windowsTerminal.js(约 89-105 行):三个独立漏洞,任意一个即可击穿宿主进程:
_inSocket(conin 写入侧)从未挂'error'监听 → 任何 write/read 错误 =Unhandled 'error' event。_outSocket的错误监听只在ready_datapipe触发后挂载;在此之前 ConPTY 管道断开(如连接超时、worker 失败、子进程被 taskkill)→ 无监听 → 同上。windowsTerminal.js的throw err(把错误从 'error' 事件处理器里抛出)。触发条件(常见于真实环境):ConPTY 子进程树被杀(taskkill/清理工具/其他 watchdog)、机器息屏唤醒后管道失效、超时回收、
_failPtyConnection竞争。一旦管道断,下一次 read/write 报read UNKNOWN(errno -4094)即触发。Impact
dsh web上任何使用持久化终端工具的会话,都可能随机拖垮整个服务器(所有并行会话、子代理、workflow 一起死)。Suggestion
windowsPtyAgent.js:构造后立刻给_outSocket/_inSocket挂'error'监听,统一转发到_failPtyConnection(失败路径已存在,会触发 terminalexit,宿主可优雅降级)。windowsTerminal.js:移除throw err(已发生_close(),错误经 agentonError→ terminalexit传递即可;恢复"抛错"需求时也应收敛到明确错误出口,而不是从'error'处理器里 throw)。All reactions