从 Mac 用系统自带「终端」执行 ssh liuhualiang@192.168.3.9 后,Terminal.app 在同一天崩溃了 5 次。崩溃的是 macOS 终端本身,不是本机 ssh,也不是 Windows 上的 OpenSSH 服务。

现象

时间 进程已运行 异常
13:42 约 26 分钟 EXC_BAD_ACCESS / SIGSEGV,Swift Observation
15:44 约 2 小时 EXC_BREAKPOINT / SIGTRAP,CoreGraphics 分配阴影样式时 malloc 元数据损坏
19:18 约 3.5 小时 EXC_BAD_ACCESS,画屏时 __CFStringCreateImmutableFunnel3
19:31 约 13 分钟 SIGBUS,Terminal 内部同一函数无限递归,栈被打穿
19:44 约 12 分钟 EXC_BAD_ACCESS / PAC,同样死在画屏创建字符串;坏指针里带有空格字节 0x20

进程都是 /System/Applications/Utilities/Terminal.app(2.15,build 488),系统是 macOS 27.0.1。会话不是握手失败立刻断开,而是连上之后跑了一段时间,在重绘窗口时崩溃。

对端

本机客户端是 OpenSSH 10.3。对端横幅是 OpenSSH_for_Windows_9.5。Windows OpenSSH 用 ConPTY 把控制台输出转成 VT 转义序列,这些序列进入 Terminal.app 的解析和绘制路径。

19:31 那次同一栈帧反复出现,是转义序列解析递归没有出口。19:18 和 19:44 两次则是画文字时字符串内存已经被写坏。

社区里有没有同样的报告

没有一份公开报告和这组签名完全一致:macOS 27 的 Terminal 2.15,连 OpenSSH_for_Windows_9.5,死在 CFStringCreateImmutableFunnel3 或 Terminal 内部递归。

相近的记录:

  • openai/codex#39265:Terminal.app 在 SSH 里跑较重的终端界面时反复崩溃,签名包括 EXC_BAD_ACCESS、堆损坏和 CoreText。远程是 Linux。
  • SSH 会话把 Terminal 的 savedState 写坏:画屏时内存损坏,窗口状态被写进 savedState,下次启动接着崩。文中建议改用 iTerm2、Ghostty 或 WezTerm。

Windows 侧另有一类相反的问题:客户端把鼠标上报序列发回 ConPTY,把 conhost 打崩,SSH 会话一起被拆掉(psmux#457)。那是 Windows 进程崩溃,对不上这次的 Terminal.app 报告。

可以换的终端

这台 Mac 上当时只有系统自带终端。下面几个都走自己的模拟器,仍然用本机 ssh:

终端 安装
iTerm2 brew install --cask iterm2
Ghostty brew install --cask ghostty
WezTerm brew install --cask wezterm

Cursor 的集成终端也是另一套实现,不会走 Terminal.app 这条绘制路径。

如果暂时还用系统终端,可以把终端类型收窄后再连:

1
TERM=xterm ssh liuhualiang@192.168.3.9