迁移后,使用_Unwind_SjLj_Resume发生奇怪的核心数据崩溃

con*_*are 6 iphone crash core-data core-data-migration mapping-model

我的一些beta测试人员遇到了一个奇怪的崩溃,我遇到了麻烦.符号化的崩溃报告表明在init调用时,控制器作为单例进行简单分配时发生了崩溃,但是根据堆栈跟踪,我所看到的代码init实际上并不是崩溃所在的位置.这是相关代码:

1534| + (UA[REDACTED]PlayerController*)sharedInstance
1535| {
1536|     @synchronized(self)
1537|     {
1538|         if (sharedInstance == nil)
1539|     sharedInstance = [[UA[REDACTED]PlayerController alloc] init];
1540|     }
1541|     return sharedInstance;
1542| }
Run Code Online (Sandbox Code Playgroud)

这从未崩溃过,而且代码最近没有随时更改过.这是升高的堆栈跟踪:

Thread 5:
0   libSystem.B.dylib              0x33bd52d4 __kill + 8
1   libSystem.B.dylib              0x33bd52c4 kill + 4
2   libSystem.B.dylib              0x33bd52b6 raise + 10
3   libSystem.B.dylib              0x33be9d26 __abort + 62
4   libSystem.B.dylib              0x33be9d7e abort + 62
5   libSystem.B.dylib              0x33bd7980 __assert_rtn + 152
6   libgcc_s.1.dylib               0x32acab4e _Unwind_SjLj_Resume + 26
7   [REDACTED]                     0x00060b64 +[UA[REDACTED]PlayerController sharedInstance] (UA[REDACTED]PlayerController.m:1540)
8   [REDACTED]                     0x00063e6c -[UA[REDACTED]PlayerViewController setupControlViews] (UA[REDACTED]PlayerViewController.m:224)
9   [REDACTED]                     0x00062ce0 -[UA[REDACTED]PlayerViewController viewDidLoad] (UA[REDACTED]PlayerViewController.m:268)
10  UIKit                          0x320a0270 -[UIViewController view] + 104
…
Run Code Online (Sandbox Code Playgroud)

关于这个神秘崩溃是什么以及它可能来自何处的任何想法?





更新1
它似乎与核心数据和迁移有关.我能够复制它,但根本原因仍然未知.我有一些自动迁移在这个版本中,并且看起来虽然可以读取一些NSManagedObjects,但其他人正在抛出此异常,特别是在NSManagedObjects关系上.它根本不相关PlayerController.任何核心数据专家都有一些见解?




更新2
这是我找到重现它的方法后崩溃的调用堆栈替代文字
和相关代码:

if (resultArray && [resultArray count]) {
    for (MixAudio *ma in resultArray) {
        Audio *audio = [ma valueForKey:LOCAL_MIX_AUDIO_AUDIO_KEY];
        if (audio) {
            [returnArray addObject:audio];
    }
}
Run Code Online (Sandbox Code Playgroud)

为了帮助解释我为重现它所做的工作,我必须解释一下数据结构.我有MixAudio物品.混音有很多音频,音频属于很多混音.这是对MixAudio对象的简单关系调用以获取音频.现在,我将数据库恢复到新版本之后,这只是崩溃了.

我的设置中的数据库备份意味着压缩数据库以保存数据,然后在恢复时解压缩.此崩溃仅在还原过程后发生.为了使事情变得更复杂,有3个带有映射模型的数据库版本.因为这个过程在版本控制之前对我有用,所以我觉得我的版本中的某些东西导致了这个崩溃.

所有其他数据都很好,可以访问,甚至保存.不知何故,这个单一的提取导致了问题.设置持久性存储或托管对象模型时没有错误或警告.此外,可以创建和访问新的Mix对象,只有较旧的提取(在还原之前位于数据库中)才会失败.

如果我没有捕获错误,控制台将打印:

Assertion failed: (_Unwind_SjLj_Resume() can't return), function _Unwind_SjLj_Resume, file /SourceCache/libunwind/libunwind-24.1/src/Unwind-sjlj.c, line 326.
Run Code Online (Sandbox Code Playgroud)

把一个try/catch绕崩溃行让我检查的根本原因坠毁:

Error: NSRangeException: *** -[NSMutableArray objectAtIndex:]: index 4294967295 beyond bounds [0 .. 16]
Run Code Online (Sandbox Code Playgroud)

但这对于一个简单的valueForKey电话来说(对我来说至少没有意义).4294967295 = 2 ^ 32-1这意味着如果有帮助,索引var可能设置为-1.我迷失在这里.





[已解决]更新3
我对它在版本控制中是正确的:)我重读了Zarra书中关于版本控制的部分并且有一个主要的DOH时刻.这是我第一次拥有3个数据库版本的应用程序.我在我的应用程序中使用Mapping Models,我天真地假设核心数据能够使用一个模型从1-2映射,然后使用下一个模型2-3.当我意识到我没有1-3映射模型时,我真的打了我的脑袋.为了测试它,我快速添加一个,一切都像黄油一样光滑.现在我只需要回过头来使用他的Progressive Data Migration样本让我的生活变得更轻松,因为我继续使用这个数据库的更多版本.

我希望Zarra在这里开车并回答一些事......任何事情......所以我可以给他点数:)

Mar*_*rra 2

虽然OP能够解决他自己的问题,但对迁移有一个清晰的了解是有帮助的。

当您创建数据模型的第二个版本时,您需要一个从版本一到版本二的映射模型。

当您创建第三个模型时,您需要一个从一到二的映射模型一个从一到三的映射。

添加第四个模型时,您需要以下模型:

  • 1-2
  • 1-3
  • 1-4
  • 2-3
  • 2-4

从那里开始,它会取得更多进展。