iOS CloudDocsLibrary 崩溃(可能是 KVO 崩溃)

iOS CloudDocsLibrary crash (probably KVO crash)

有没有其他人遇到过崩溃(EXC_BAD_ACCESS),堆栈跟踪如下:

0 Object_isClass
22 UIApplicationMain
23 main
24 start

如果我在堆栈跟踪中单击 UIApplicationMain,则会得到以下信息:

UIKitCore`UIApplicationMain:
0x21a6ef8a4 <+0>:   stp    x24, x23, [sp, #-0x40]!
0x21a6ef8a8 <+4>:   stp    x22, x21, [sp, #0x10]
0x21a6ef8ac <+8>:   stp    x20, x19, [sp, #0x20]
0x21a6ef8b0 <+12>:  stp    x29, x30, [sp, #0x30]
0x21a6ef8b4 <+16>:  add    x29, sp, #0x30            ; =0x30 
0x21a6ef8b8 <+20>:  mov    x20, x3
0x21a6ef8bc <+24>:  mov    x21, x1
0x21a6ef8c0 <+28>:  mov    x22, x0
0x21a6ef8c4 <+32>:  mov    x0, x2
0x21a6ef8c8 <+36>:  bl     0x21ac17b68               ; symbol stub for: -[_UICloudSharingActivity _activitySupportsPromiseURLs]
0x21a6ef8cc <+40>:  mov    x19, x0
0x21a6ef8d0 <+44>:  mov    x0, x20
0x21a6ef8d4 <+48>:  bl     0x21ac17b68               ; symbol stub for: -[_UICloudSharingActivity _activitySupportsPromiseURLs]
0x21a6ef8d8 <+52>:  mov    x20, x0
0x21a6ef8dc <+56>:  mov    w0, #0x168
0x21a6ef8e0 <+60>:  movk   w0, #0x2b87, lsl #16
0x21a6ef8e4 <+64>:  mov    w1, #0x32
0x21a6ef8e8 <+68>:  mov    x2, #0x0
0x21a6ef8ec <+72>:  mov    x3, #0x0
0x21a6ef8f0 <+76>:  mov    x4, #0x0
0x21a6ef8f4 <+80>:  bl     0x21ac1779c               ; symbol stub for: __66-[UICloudSharingController _deleteShareAfterDismissalWithoutSave:]_block_invoke_2
0x21a6ef8f8 <+84>:  orr    w0, wzr, #0x3
0x21a6ef8fc <+88>:  orr    w1, wzr, #0x3
0x21a6ef900 <+92>:  mov    x2, #-0x1
0x21a6ef904 <+96>:  orr    x4, xzr, #0x8000000000000000
0x21a6ef908 <+100>: mov    w3, #0x0
0x21a6ef90c <+104>: bl     0x21ac175c8               ; symbol stub for: -[UIWebView webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:]
0x21a6ef910 <+108>: adrp   x23, 52595
0x21a6ef914 <+112>: ldr    w8, [x23, #0x364]
0x21a6ef918 <+116>: cbz    w8, 0x21a6ef9a0           ; <+252>
0x21a6ef91c <+120>: lsr    w8, w8, #8
0x21a6ef920 <+124>: cmp    w8, #0x201                ; =0x201 
0x21a6ef924 <+128>: b.lo   0x21a6ef950               ; <+172>
0x21a6ef928 <+132>: bl     0x21ac17a48               ; symbol stub for: -[_UIShareParticipantDetails detailText]
0x21a6ef92c <+136>: mov    x23, x0
0x21a6ef930 <+140>: mov    x0, x22
0x21a6ef934 <+144>: mov    x1, x21
0x21a6ef938 <+148>: mov    x2, x19
0x21a6ef93c <+152>: mov    x3, x20
0x21a6ef940 <+156>: bl     0x21a6ef9d0               ; _UIApplicationMainPreparations
0x21a6ef944 <+160>: mov    x0, x23
0x21a6ef948 <+164>: bl     0x21ac17a3c               ; symbol stub for: -[_UIShareParticipantDetails setParticipantID:]
0x21a6ef94c <+168>: b      0x21a6ef964               ; <+192>
0x21a6ef950 <+172>: mov    x0, x22
0x21a6ef954 <+176>: mov    x1, x21
0x21a6ef958 <+180>: mov    x2, x19
0x21a6ef95c <+184>: mov    x3, x20
0x21a6ef960 <+188>: bl     0x21a6ef9d0               ; _UIApplicationMainPreparations
0x21a6ef964 <+192>: adrp   x8, 52595
0x21a6ef968 <+196>: ldr    x0, [x8, #0x328]
0x21a6ef96c <+200>: adrp   x8, 1577
0x21a6ef970 <+204>: add    x1, x8, #0xad5            ; =0xad5 
0x21a6ef974 <+208>: bl     0x21ac17b2c               ; symbol stub for: CloudDocsLibrary
0x21a6ef978 <+212>: mov    x0, x20  <--- Exception bad access code 1
0x21a6ef97c <+216>: bl     0x21ac17b5c               ; symbol stub for: -[_UICloudSharingActivity _documentSharingControllerDidDismiss:]
0x21a6ef980 <+220>: mov    x0, x19
0x21a6ef984 <+224>: bl     0x21ac17b5c               ; symbol stub for: -[_UICloudSharingActivity _documentSharingControllerDidDismiss:]
0x21a6ef988 <+228>: mov    w0, #0x0
0x21a6ef98c <+232>: ldp    x29, x30, [sp, #0x30]
0x21a6ef990 <+236>: ldp    x20, x19, [sp, #0x20]
0x21a6ef994 <+240>: ldp    x22, x21, [sp, #0x10]
0x21a6ef998 <+244>: ldp    x24, x23, [sp], #0x40
0x21a6ef99c <+248>: ret    
0x21a6ef9a0 <+252>: adrp   x8, 52593
0x21a6ef9a4 <+256>: ldr    x8, [x8, #0xf40]
0x21a6ef9a8 <+260>: cmn    x8, #0x1                  ; =0x1 
0x21a6ef9ac <+264>: b.ne   0x21a6ef9b8               ; <+276>
0x21a6ef9b0 <+268>: ldr    w8, [x23, #0x364]
0x21a6ef9b4 <+272>: b      0x21a6ef91c               ; <+120>
0x21a6ef9b8 <+276>: adrp   x0, 52593
0x21a6ef9bc <+280>: add    x0, x0, #0xf40            ; =0xf40 
0x21a6ef9c0 <+284>: adrp   x1, 41868
0x21a6ef9c4 <+288>: add    x1, x1, #0x640            ; =0x640 
0x21a6ef9c8 <+292>: bl     0x21ac17490               ; symbol stub for: -[UIWebView _webView:commitPreview:]
0x21a6ef9cc <+296>: b      0x21a6ef9b0               ; <+268>

看起来它在尝试做一些 CloudKit 事情时崩溃了?这很奇怪,因为我们没有任何 CloudKit 设置...

我只见过本地崩溃(当 运行 到 Xcode 时),而不是在我们的 CI 中。我们最近添加了一些 CoreData 用法,这会以某种方式相关吗?

似乎 CloudKit 东西可能是一个转移注意力的东西,实际上这是一个 KVO 崩溃,因为当我在控制台中 运行 'bt' 命令时,我得到了回溯,包括以下警告: KVO_IS_RETAINING_ALL_OBSERVERS_OF_THIS_OBJECT_IF_IT_CRASHES_AN_OBSERVER_WAS_OVERRELEASED_OR_SMASHED

我在尝试追踪 KVO 崩溃时看到了这个问题,所以这在一定程度上是有道理的……遗憾的是堆栈中没有更多信息!

我仍然不知道为什么会发生这种崩溃,但我已经通过更改一些 KVO 设置设法摆脱了它。

为了追踪有问题的 KVO,我注释掉了 KVO 代码的各个部分和 运行 一个自定义测试套件,它总是会在 30 分钟左右的时间内崩溃。这让我想到了一些基于块的 KVO AVPlayerItem 的状态 属性 是罪魁祸首。

我记得看到一位非常睿智的人引用了

的话

"Block-based KVO, it just works (until it doesn't)" - Anon

所以我将基于块的 KVO 切换为旧的回调样式,崩溃似乎已经消失了。

感叹