跳转至

原生 PTY 派生环境生命周期

原生 PTY 句柄的退出回调捕获了其完整创建参数,仅用于读取 reportsChildExitStatus。这些参数包含合并后的派生环境。在注册回调之前复制该布尔值,可在 PTY 仍然存活期间释放参数和环境。

这是按句柄的保留:当句柄和原生事件所有者变为不可达后,原始对象也会被回收。它并未确立每个终端关闭后的保留、原生 PTY 内存使用量、RSS 斜率或 #19831 的原因。

所有权与兼容性

  • src/main/daemon/pty-subprocess.ts:72–113 创建环境,完成预检和原生派生,然后向 createDaemonPtySubprocessHandle 传递一个新的对象字面量。这是唯一的生产调用点;调用方此后不会存储或修改该对象。
  • src/main/daemon/pty-subprocess/native-pty-spawn.ts:29–74 从选定的原生启动命令同步计算 reportsChildExitStatus。每次成功返回都会将该布尔值复制到其结果中。在此调用链中,它是一个不可变的派生事实。
  • src/main/daemon/pty-subprocess/subprocess-handle.ts:26–69 需要进程、投影的前台元数据、标量退出状态事实和 PATH。其长期存活的退出回调此前保留了整个参数对象。修复仅改变该捕获。原生派生、原生信号所有权、物理退出顺序、释放和输出缓冲均保持不变。
  • 环境是一个新的合并对象,但其许多字符串值可能已与 process.env 共享。释放其可达性并不意味着驻留字节数有同等减少。所需的 PATH 仍可通过 shellPathEnv 到达。

source-versions.json 记录精确哈希。主提交 291b4ddd6f1c1af480169885e0fda7f9c78ff053 与受审计的包装器基线完全匹配。发布 v1.4.198(e0826956fcfc532f5a1e55b5e081f2e57e553c43)具有相同的环境捕获和调用方,但早于无关的 I/O 失败和退出监听器顺序变更。两行补丁适用于这两个指定源。这是历史源代码比较,不是历史打包运行时复现。

该变更保持在守护进程的执行宿主包装器内部。它不添加任何远程线路数据或客户端进程判定,也不依赖 git worktree 或文件夹工作区。

有界的前后证明

sources.cjs 在内存中反转 fix.patch,并在打包任一版本之前检查精确的基线和修复后 SHA-256 值。它导入实际的前台跟踪器和监听器前队列,并记录所有有效源依赖哈希以及生成的捆绑包哈希。重新运行它不需要 git 引用、复制的生产实现、构建输出、凭据或被忽略的笔记。

源和补丁读取在反转和哈希之前将 CRLF 规范化为 LF;记录的命名源、依赖和事件发射器哈希使用规范 LF。该证明还将合成的 CRLF 源和补丁文本在内存中送入加载器,并验证前后源和哈希相同,而不写入产品文件。这检查的是检出换行符情况,而不是 Windows 运行时。

测试夹具使用已安装的 node-pty JavaScript 事件发射器和一个惰性进程端口。原生终止导入和 process.kill 受到保护;不会创建原生 PTY、子进程扫描、OS 信号、套接字或窗口。WeakRefs 测量一个小参数对象和一个小环境对象,没有负载放大。截止时间为 15 秒,这些命令中的堆限制为 128 MiB。

运行时 修复前活动句柄:参数 / 环境 修复后活动句柄:参数 / 环境 所有者释放后,两个版本
Node 26.6.0 1 / 1 0 / 0 0 / 0
Electron 43.7.0 / Node 24.21.0 1 / 1 0 / 0 0 / 0

两个版本都保留 PATH、启动投递元数据、原始前台查找、监听器前输出和退出重放、正常退出代码、信号原因、不可用包装器状态、死句柄信号保护以及幂等释放。node-results.json 和 electron-results.json 包含测量结果。

从仓库根目录运行 Node 证明:

ORCA_BACKGROUND_LAUNCH=1 node --expose-gc --max-old-space-size=128 docs/audits/native-pty-spawn-env-retention/reproduce.cjs

对于 Electron,使用 --expose-gc --max-old-space-size=128 docs/audits/native-pty-spawn-env-retention/reproduce.cjs 运行已安装的 Electron 可执行文件。在其环境中设置 ELECTRON_RUN_AS_NODE=1 和 ORCA_BACKGROUND_LAUNCH=1。这使 Electron 保持 Node 模式;它不创建窗口。

回归检查

新的生命周期回归在原生退出之前测量回收,然后确认活动句柄仍能传递数据和退出。另外两个用例在回收后保留两种退出状态解释。现有的生命周期、前台身份/节奏、环境继承和 I/O 失败清理套件覆盖相邻契约。

修复后的六文件运行通过 114 个测试,并有四个现有平台跳过。可逆基线叠加运行了新的和现有的生命周期套件:一个预期的生命周期失败,29 个通过的对照。要在不编辑产品文件的情况下复现叠加:

ORCA_BACKGROUND_LAUNCH=1 pnpm exec vitest run --config docs/audits/native-pty-spawn-env-retention/before.config.mjs src/main/daemon/pty-subprocess-env-retention.test.ts src/main/daemon/pty-subprocess-handle-lifecycle.test.ts

validation.json 记录验证命令和结果。待创建取消审计是独立的,此处未更改。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca