Description 发生了什么?/ 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 或对象释放顺序问题)。
重现步骤(建议补充给开发者)
打开 Navop,连接数据库 / 打开 SQL 编辑器。
编辑后执行"保存"(或依赖 sql_auto_save 每 5 秒自动保存)。
窗口/面板收起瞬间崩溃。
附件(崩溃报告,位于本机)
~/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)
升级到最新版 0.18.6 —— 仍崩(且 0.18.5 也崩)。
系统级将 Touch Bar 设为"功能键模式"(defaults write com.apple.touchbar.agent PresentationModeGlobal -string "functionKeys" 并重启 ControlStrip)—— 仍崩。
→ 说明崩溃并非由系统 Touch Bar 呈现模式门控,而是 Navop 在窗口/面板收起时对 Touch Bar 相关 KVO 观察的注册与注销不平衡(典型为重复 removeObserver 或观察对象释放顺序错误),AppKit 在显示周期清理该观察时抛未捕获异常被 _crashOnException:` 致命终止。
关闭 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
Reactions are currently unavailable
You can’t perform that action at this time.
发生了什么?/ What happened?
环境
崩溃签名(所有报告一致)
关键调用栈
主线程(崩溃帧):
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 或对象释放顺序问题)。
重现步骤(建议补充给开发者)
附件(崩溃报告,位于本机)
备注
已尝试的绕过方案(均无效,确认是 Navop 自身 bug)
→ 说明崩溃并非由系统 Touch Bar 呈现模式门控,而是 Navop 在窗口/面板收起时对 Touch Bar 相关 KVO 观察的注册与注销不平衡(典型为重复 removeObserver 或观察对象释放顺序错误),AppKit 在显示周期清理该观察时抛未捕获异常被 _crashOnException:` 致命终止。
结论:唯一根治方式是 Navop 开发者修复 KVO 注销逻辑。建议尽快上报此报告。
附件(崩溃报告,位于本机)
如何复现?/ How can we reproduce it?
No response
版本与系统 / Version and system
No response
截图、日志或其他信息 / Screenshots, logs, or anything else
No response