Skip to content

[Bug]: macOS 创建 SSH 连接后点击“确定”闪退(Touch Bar observer exception) #308

Description

@pdymerej

发生了什么?/ What happened?

在 macOS 上创建 SSH 连接,输入连接信息后点击“确定”,Navop 直接闪退。

预期:保存连接信息并正常继续;即使连接失败,也应显示错误而不是退出应用。
实际:应用崩溃退出。是否每次发生、认证方式、是否已成功保存连接,尚未确认。

如何复现?/ How can we reproduce it?

  1. 打开 Navop。
  2. 创建一个 SSH 连接。
  3. 输入连接信息。
  4. 点击“确定”。
  5. 应用闪退。

版本与系统 / Version and system

Navop 0.19.2;macOS 15.8 (24H23);X86-64 (Native)。0.19.1 的历史崩溃报告也有相同堆栈。

截图、日志或其他信息 / Screenshots, logs, or anything else

崩溃信息

  • Bundle ID:com.onetcli.app
  • 崩溃时间:2026-09-26 11:13:25 +0800
  • 崩溃线程:0,main / com.apple.main-thread
  • Exception:EXC_BAD_INSTRUCTION (SIGILL)
  • Termination:Namespace SIGNAL, Code 4

本机 2026-09-24 至 2026-09-26 共 21 份 Navop 崩溃报告均包含 _NSTouchBarFinderObservation invalidate → removeObserver → Objective-C exception 的调用链。

报告显示 AppKit 在界面刷新时移除 Touch Bar 观察者抛出异常,随后通过 NSApplication _crashOnException: 终止进程。怀疑与点击确定后的弹窗关闭、焦点/响应链变化或相关对象生命周期有关;这是排查假设,尚未通过源码或调试器验证。报告未包含异常的完整 reason,因此不能确定具体 observer/keyPath,也不能认定是 SSH 参数问题。

Application Specific Backtrace 0

0   CoreFoundation 0x00007ff80791690a __exceptionPreprocess + 242
1   libobjc.A.dylib 0x00007ff8073e024b objc_exception_throw + 62
2   Foundation 0x00007ff8089e1143 -[NSObject(NSKeyValueObserverRegistration) _removeObserver:forProperty:] + 680
3   Foundation 0x00007ff8089e0e55 -[NSObject(NSKeyValueObserverRegistration) removeObserver:forKeyPath:] + 129
4   Foundation 0x00007ff8089e0b1b -[NSObject(NSKeyValueObserverRegistration) removeObserver:forKeyPath:context:] + 225
5   AppKit 0x00007ff80bc7766c -[_NSTouchBarFinderObservation invalidate] + 294
6   AppKit 0x00007ff80bc78e1b ___NSTouchBarFinderSetNeedsUpdateOnMain_block_invoke_2 + 962
7   AppKit 0x00007ff80b3c9036 NSDisplayCycleObserverInvoke + 140
8   AppKit 0x00007ff80b3c8c68 NSDisplayCycleFlush + 878
9   QuartzCore 0x00007ff810ab6719 _ZN2CA11Transaction19run_commit_handlersE18CATransactionPhase + 95
10  QuartzCore 0x00007ff810ab4e1e _ZN2CA11Transaction6commitEv + 384
11  AppKit 0x00007ff80b4601c1 __62+[CATransaction(NSCATransaction) NS_setFlushesWithDisplayLink]_block_invoke + 289
12  AppKit 0x00007ff80bfb521e ___NSRunLoopObserverCreateWithHandler_block_invoke + 41
13  CoreFoundation 0x00007ff8078a783d __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
14  CoreFoundation 0x00007ff8078a7759 __CFRunLoopDoObservers + 511
15  CoreFoundation 0x00007ff8078a6cf8 __CFRunLoopRun + 911
16  CoreFoundation 0x00007ff8078a6332 CFRunLoopRunSpecific + 536
17  HIToolbox 0x00007ff8133970d4 RunCurrentEventLoopInMode + 281
18  HIToolbox 0x00007ff813399e60 ReceiveNextEventCommon + 188
19  HIToolbox 0x00007ff81352319a _BlockUntilNextEventMatchingListInModeWithFilter + 63
20  AppKit 0x00007ff80b30cdc1 _DPSNextEvent + 912
21  AppKit 0x00007ff80bd9ac17 -[NSApplication(NSEventRouting) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1263
22  AppKit 0x00007ff80b2fdea9 -[NSApplication run] + 610
23  navop 0x000000010f888da0 navop + 48242080
24  navop 0x000000010cf202dc navop + 4821724
25  navop 0x000000010cbcb9f6 navop + 1329654
26  navop 0x000000010d1c472a navop + 7591722
27  dyld 0x00007ff807418530 start + 3056

Thread 0 Crashed(顶部堆栈)

0 AppKit 0x7ff80b659cd7 -[NSApplication _crashOnException:] + 302
1 AppKit 0x7ff80b4603ff __62+[CATransaction(NSCATransaction) NS_setFlushesWithDisplayLink]_block_invoke + 863
2 AppKit 0x7ff80bfb521e ___NSRunLoopObserverCreateWithHandler_block_invoke + 41

相关参考

其他应用在 Intel macOS 15.7.3 上有相同 AppKit 堆栈的报告,可作为排查线索,并不代表已经确认相同根因:
emilk/egui#7857

已省略个人标识、本机用户名和 UUID 等与定位无关的信息。不包含 SSH 地址、用户名、密码或密钥。

Activity

  1. feigeCode commented on Sep 26, 2026

    @feigeCode
    Owner

    已在上游 gpui 仓库立单:zed-industries/zed#64819

    标题:gpui_macos: closing a window can abort on Touch Bar Macs (_NSTouchBarFinderObservation deregistration lands on an already-deallocated view)

    给后续排查用的结论摘要:

    • 不是 SSH 参数、认证方式或校验逻辑的问题。 崩溃发生在 AppKit 自己的 Touch Bar 观察者注销流程里:-[_NSTouchBarFinderObservation invalidate] → removeObserver:forKeyPath:context:。AppKit 把这次注销推迟到「下一个 display cycle」,而它要注销的那个 NSView 此时已经被释放(KVO 会在对象 dealloc 时自动清掉全部观察),于是抛 NSRangeException: …because it is not registered as an observer,再由 -[NSApplication _crashOnException:] 终止进程。异常发生在 AppKit 内部,没有任何应用帧,所以应用侧捕获不到。
    • 只在带 Touch Bar 的 Mac 上复现:本机 X86-64(Intel)报告、另一台 M2 13" 机型的报告都是同一调用链;Apple Silicon 的 M1 机型(MacBookPro17,1)也有同类报告。无 Touch Bar 的机器复现不了。
    • 另一个基于同一套 gpui 的应用有逐帧相同的调用链:macOS: intermittent NSRangeException from _NSTouchBarFinderObservation removing a nextResponder observer longbridge/gpui-kit#3192,那里的异常文本正是 Cannot remove an observer <_NSTouchBarFinderObservation> for the key path "nextResponder" from <NSView …> because it is not registered as an observer.
    • 规避手段:macOS 上把「关闭窗口」改成隐藏窗口并复用(orderOut:),不再销毁原生窗口 —— 这正是 Navop v0.18.6 起在部分窗口上已经采用的做法,上线后该机型不再回报此崩溃。
    • 本单这几次崩溃发生在**「新建连接」窗口**:这类窗口目前仍走「关闭即销毁原生窗口」的旧路径,尚未接入隐藏复用策略,因此仍在暴露同一个 AppKit 竞态。剩余关闭点正在按同一策略逐批接管。
  2. feigeCode commented on Sep 29, 2026

    @feigeCode
    Owner

    试试最新版

  3. pdymerej commented on Sep 29, 2026

    @pdymerej
    Author

    试试最新版

    最新版没问题了

  4. added a commit that references this issue on Oct 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions