Skip to content

[Bug]: 保存连接即崩溃 #314

Description

@lonestonewy

发生了什么?/ What happened?

环境

  • 应用:Navop(bundle com.onetcli.app) 版本 0.18.6(当前最新;已确认 0.18.5 与 0.18.6 均复现,非版本回归可解)
  • 系统:macOS 15.7.9 (24G830)
  • 机型:MacBookPro16,1(Intel,带 Touch Bar)
  • 复现频率:2026-09-22 当天 09:43–12:09 间崩溃 11+ 次,均在"保存"操作时触发,必现
    崩溃签名(所有报告一致)
  • 异常:EXC_BAD_INSTRUCTION / 信号 SIGILL(Illegal instruction: 4)
  • 线程:主线程(faultingThread 0)
  • 触发链:AppKit 未捕获 Objective-C 异常 → -[NSApplication _crashOnException:] → 进程 abort
    关键调用栈
    主线程(崩溃帧):
    0 AppKit -[NSApplication _crashOnException:]
    1 AppKit +[CATransaction(NSCATransaction) NS_setFlushesWithDisplayLink]_block_invoke
    2 AppKit ___NSRunLoopObserverCreateWithHandler_block_invoke
    3 CoreFoundation CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION
    4 CoreFoundation __CFRunLoopDoObservers
    5 CoreFoundation __CFRunLoopRun
    6 CoreFoundation CFRunLoopRunSpecific
    ...
    12 AppKit -[NSApplication run]
    抛出异常的根因栈(asiBacktraces):
    0 CoreFoundation __exceptionPreprocess
    1 libobjc.A.dylib objc_exception_throw
    2 Foundation -[NSObject(NSKeyValueObserverRegistration) _removeObserver:forProperty:]
    3 Foundation -[NSObject(NSKeyValueObserverRegistration) removeObserver:forKeyPath:]
    4 Foundation -[NSObject(NSKeyValueObserverRegistration) removeObserver:forKeyPath:context:]
    5 AppKit -[_NSTouchBarFinderObservation invalidate]
    6 AppKit ___NSTouchBarFinderSetNeedsUpdateOnMain_block_invoke_2
    7 AppKit NSDisplayCycleObserverInvoke
    8 AppKit NSDisplayCycleFlush
    9 QuartzCore CA::Transaction::run_commit_handlers
    10 QuartzCore CA::Transaction::commit
    根因分析
    保存操作会关闭/收起窗口或面板(如保存 sheet),触发 AppKit 在显示周期(display cycle)里清理该窗口/响应者的 Touch Bar 观察(_NSTouchBarFinderObservation invalidate)。此时 Foundation 的 removeObserver:forKeyPath:context: 抛出了 KVO 失衡异常(观察者未正确注销 / 观察对象已被半释放),异常逃到主线程 run loop,被 AppKit 的 _crashOnException: 以 SIGILL 致命终止。
    崩溃线程上没有任何 Navop 自有符号,说明是 AppKit 对 Navop 窗口的 Touch Bar 观察清理逻辑触发,根因在 Navop 对窗口/Touch Bar 的 KVO 注册与注销不平衡(典型为重复 removeObserver 或对象释放顺序问题)。
    重现步骤(建议补充给开发者)
  1. 打开 Navop,连接数据库 / 打开 SQL 编辑器。
  2. 编辑后执行"保存"(或依赖 sql_auto_save 每 5 秒自动保存)。
  3. 窗口/面板收起瞬间崩溃。
    附件(崩溃报告,位于本机)
  • ~/Library/Logs/DiagnosticReports/navop-2026-09-22-120341.ips(最新,0.18.6)
  • ~/Library/Logs/DiagnosticReports/navop-2026-09-22-10*.ips(共 10 份,签名一致)
    备注
  • 当前最新版本 0.18.6 未修复此问题;如需异常原因原文("Cannot remove an observer … because it is not registered"),可在 Console.app 打开上述 .ips 查看 "Exception" 备注。
    已尝试的绕过方案(均无效,确认是 Navop 自身 bug)
  1. 升级到最新版 0.18.6 —— 仍崩(且 0.18.5 也崩)。
  2. 系统级将 Touch Bar 设为"功能键模式"(defaults write com.apple.touchbar.agent PresentationModeGlobal -string "functionKeys" 并重启 ControlStrip)—— 仍崩。
    → 说明崩溃并非由系统 Touch Bar 呈现模式门控,而是 Navop 在窗口/面板收起时对 Touch Bar 相关 KVO 观察的注册与注销不平衡(典型为重复 removeObserver 或观察对象释放顺序错误),AppKit 在显示周期清理该观察时抛未捕获异常被 _crashOnException:` 致命终止。
  3. 关闭 SQL 自动保存(enable_sql_auto_save: false)—— 仅降低 UI 抖动频率,手动保存仍崩。
    结论:唯一根治方式是 Navop 开发者修复 KVO 注销逻辑。建议尽快上报此报告。
    附件(崩溃报告,位于本机)
  • ~/Library/Logs/DiagnosticReports/navop-2026-09-22-120940.ips(最新,0.18.6,12:09:40)
  • ~/Library/Logs/DiagnosticReports/navop-2026-09-22-120341.ips(0.18.6)
  • ~/Library/Logs/DiagnosticReports/navop-2026-09-22-10*.ips(共 11 份,签名一致)

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

No response

版本与系统 / Version and system

No response

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

No response

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