迁移后,奇怪的核心数据与_Unwind_SjLj_Resume崩溃

时间:2011-01-07 14:26:08

标签: iphone core-data crash mapping-model core-data-migration

我的一些测试版测试人员遇到了一个奇怪的崩溃,我遇到了麻烦。符号化的崩溃报告表明在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| }

之前从未崩溃,代码最近没有改变。这是升高的堆栈跟踪:

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
…

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




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



更新2
在我找到重现它的方法后,这是崩溃的调用堆栈alt text
和相关代码:

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

为了帮助解释我做了什么来重现它,我必须解释一下数据结构。我有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.

在崩溃线周围放置一个try/catch,可以检查根崩溃原因:

Error: NSRangeException: *** -[NSMutableArray objectAtIndex:]: index 4294967295 beyond bounds [0 .. 16]

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




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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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