保留的 OSC 133 不完整携带¶
共享的命令生命周期扫描器会保留一个最多 4,096 个 UTF-16 码元的不完整 OSC 133 后缀。V8 切片字符串可能通过该小后缀使整个前置 PTY 输入保持存活。修正仅通过现有 ownRetainedString 复制最终的不完整携带;短前缀、内容、解析、回调、权限和重置行为均保持不变。
这为 #20960 增加了第 15 个保留文本边界,继 kitty/mouse 尾部 和其他 保留文本切片 之后。它不引入任何线上变更,并且同等适用于到达共享扫描器的本地和 SSH/远程终端字节。
复现¶
ORCA_BACKGROUND_LAUNCH=1 node --expose-gc --max-old-space-size=192 docs/audits/osc133-carry-retention/reproduce.cjs
使用已安装的 Electron 可执行文件运行同一脚本,设置
ELECTRON_RUN_AS_NODE=1 和 ORCA_BACKGROUND_LAUNCH=1,并使用相同的 Node 标志。
不会创建应用程序窗口、原生 PTY 或网络。运行器有
60 秒截止时间,并接受可选的输出报告路径作为第一个
参数;否则它在此处写入 Node 或
Electron 结果。
便携式加载器验证全部 28 个捆绑源模块和七个额外的 调用方/fixture 文件。未求值的来源调用方仅接受已记录的 已审计或命名 main 字节,报告标识其中存在哪一个;每个已求值 模块都需要一个精确的固定哈希。它仅通过零上下文 补丁 在内存中反转新的 import/copy 调用,然后验证基线哈希。所有 已求值源和工件哈希均被记录。它不需要 Git 历史、 被忽略的笔记或绝对开发者路径。源/补丁读取会规范化 CRLF; 内存中的 CRLF 对照检查等价的前后字符串。
扫描器基线精确匹配命名 main
291b4ddd6f1c1af480169885e0fda7f9c78ff053 和 v1.4.198
(e0826956fcfc532f5a1e55b5e081f2e57e553c43)。该复制器在
v1.4.198 中不存在;本实验两侧均使用当前辅助函数和调用方。
来源溯源 分别记录每个命名
身份/缺失。这不是完整历史应用的回放。
结果与控制¶
Node 26.6 和 Electron 43.7 / Node 24.21 均通过 117 个用例。每个运行时 通过实际扫描器、共享标题跟踪器和守护进程后台瞬态事实 中继,比较基线、固定 Buffer 复制器和固定 Bufferless 复制器。32 个 64 Ki 字符输入在复制前保留约 2 MiB; 8 个 1 Mi 字符输入保留约 8 MiB。固定差异低于 断言的 1 MiB 容差,包括所有者开销。完成和重置/退出 会释放旧父对象。精确的 GC 敏感测量在报告中; 它们是堆差异,不是 RSS 或精确分配归因。
普通序列字节来自 src/shared/terminal-mode-2031-final-state.test.ts 中记录的 fish 4.7.1 捕获:A;click_events=1 和
C;cmdline_url=npx。该捕获包含完整的 OSC 序列。大型
纯输出前缀和终止符前的截断是合成的。 这并不
声称原始捕获具有这些大小或边界。
控制项保留 BEL/ST 完成、拆分前缀、C/D 回调值、
后台禁用/重新启用、重置,以及 Unicode/NUL/孤立代理项
fixture 的每种拆分。当 Buffer 缺失时选择 Bufferless 复制器,
然后在测量前恢复 Buffer;这在不启动渲染器的情况下验证渲染器的
实际回退。短普通 D;0 前缀、
完整序列和纯输入是负保留控制。超大
未终止输入被单独标记为错误协议压力。V8 的
独立的最后一次成功 RegExp 输入在两次测量前被重置。
八个永久测试覆盖两种复制器路径、长捕获 fish 后缀、
完成、重置和短 D;0。使用内存基线覆盖时,恰好
四个长后缀回归在 33,550,680–33,565,360 保留字节处失败,相对于
2 MiB 容限;四套件运行中的其他 41 个测试通过。固定运行
通过全部 45 个。更广泛的证明/质量验证记录在
validation.json 中。
所有者与普通输入边界¶
主进程在 orca-runtime-get-unpersisted-tracked-title-for-pty.ts 中通过 onCommandFinished 创建每个 PTY 的跟踪器;扫描器启用仍
尊重瞬态事实消费者/权限状态。交付给主进程的普通守护进程输出帧
在 daemon-stream-data-batcher.ts 中被切片为 64 Ki 字符,普通中继输出在 src/relay/pty-handler.ts 中被切片为 16 Ki 字符。因此,64 Ki 用例展示了保留,而不需要多兆字节的主进程输入;1 Mi 用例放大该机制。回放和转换输出有其自身现有限制。
守护进程的 BackgroundTransientFactRelay 为每个后台会话拥有一个跟踪器。daemon-terminal-admission.ts 在输出批处理之前向其提供数据,因此批处理器稍后的切片不是此守护进程扫描器的输入上限。原生数据通过 pty-subprocess/subprocess-handle.ts、会话的 shell 就绪/启动/恢复路径及其流客户端传递。检查的本地接收不施加独立的字符串长度限制;此处未测量平台/原生库块大小。
不完整转义的完成/替换、扫描器重置、会话退出、 后台退役、跟踪器处置或所有者释放会丢弃旧父对象。 这最多是每个活动扫描器最后一个不完整父对象的成本,而不是每个历史块的列表。多个读取器可能共享同一输入后备存储;不要将它们隔离的测量相加为独立进程总和。
这是一个复现的代码级保留机制。它并未建立 原生输出暂停、正常会话频率/持续时间、#19831/#19768 中的触发器、 已报告的持续增长率,或数 GB 事件的 原因。该变更不会减少原始输入分配。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca