没有堆栈跟踪的高山脉上的 SIGSEGV

SIGSEGV on high sierra without a stacktrace

我们的应用已经开始崩溃,仅在 macOS 10.13.6 上有一些用户,崩溃日志如下。这并不能告诉我们太多。我们已尝试进行多项调整,但无济于事。当我们无法访问用户的机器时,我们该如何解决?他们已尝试重置应用程序、重新启动、重新安装等,但无济于事。

我们没有收到任何其他版本的 macOS 的投诉。已尝试在 Xcode 中启用僵尸程序以及所有其他与内存相关的调试选项,但没有任何反应(在 macOS 11 上进行测试时)。我们不能在 10.13 上构建,因为我们的代码需要 Xcode 12.

Crashed Thread: 0 Dispatch queue: com.apple.main-thread

Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000103e00cebec8
Exception Note: EXC_CORPSE_NOTIFY

Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [0]

VM Regions Near 0x103e00cebec8:
    CoreAnimation 0000000125666000-0000000125f1f000 [ 8932K] rw-/rwx SM=PRV
-->
    MALLOC_NANO 0000600000000000-0000600001e00000 [ 30.0M] rw-/rwx SM=PRV

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libobjc.A.dylib 0x00007fff57f9b184 objc_release + 36
1 libobjc.A.dylib 0x00007fff57f9c087 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 817
2 com.apple.AppKit 0x00007fff2e34039b __37+[NSDisplayCycle currentDisplayCycle]_block_invoke + 244
3 com.apple.QuartzCore 0x00007fff3bff8877 CA::Transaction::run_commit_handlers(CATransactionPhase) + 49
4 com.apple.QuartzCore 0x00007fff3bff7339 CA::Transaction::commit() + 171
5 com.apple.AppKit 0x00007fff2eaf8a72 __65+[CATransaction(NSCATransaction) NS_setFlushesWithDisplayRefresh]_block_invoke + 283
6 com.apple.CoreFoundation 0x00007fff30c88097 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
7 com.apple.CoreFoundation 0x00007fff30c87fbf __CFRunLoopDoObservers + 527
8 com.apple.CoreFoundation 0x00007fff30c6a538 __CFRunLoopRun + 1240
9 com.apple.CoreFoundation 0x00007fff30c69dd3 CFRunLoopRunSpecific + 483
10 com.apple.HIToolbox 0x00007fff2ff54d96 RunCurrentEventLoopInMode + 286
11 com.apple.HIToolbox 0x00007fff2ff54b06 ReceiveNextEventCommon + 613
12 com.apple.HIToolbox 0x00007fff2ff54884 _BlockUntilNextEventMatchingListInModeWithFilter + 64
13 com.apple.AppKit 0x00007fff2e201a3b _DPSNextEvent + 2085
14 com.apple.AppKit 0x00007fff2e997e34 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 3044
15 com.apple.AppKit 0x00007fff2e1f684d -[NSApplication run] + 764
16 com.apple.AppKit 0x00007fff2e1c5a3a NSApplicationMain + 804
17 libdyld.dylib 0x00007fff58bc4015 start + 1

结果证明这是一场噩梦,因为我们花了 3 天多的时间,尝试了 40 次左右。没有任何效果。事实证明,这是对我们在 updateConstraints() 中删除并重新创建的单元格 textField 的约束。仅在 macOS 10.13 上,这会导致 textField 以某种方式过分释放。解决方案是将之前的约束存储在一个 ivar 中,以便仍然有对该控件的强引用,以防止它被释放。