Странный сбой основных данных при использовании _Unwind_SjLj_Resume после миграции

Я получаю странный сбой от некоторых из моих бета-тестеров, с которыми у меня возникли проблемы. Символьные отчеты о сбоях показывают, что сбой происходит при простом выделении контроллера как синглтона, при вызове 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. Есть ли у экспертов Core-Data какое-то понимание? но основная причина до сих пор неизвестна. У меня есть несколько автоматических миграций, которые есть в этой версии, и похоже, что, хотя некоторые из NSManagedObjects могут быть прочитаны, другие выдают это исключение, особенно в отношении NSManagedObjects. Возможно, это вообще не связано с PlayerController. Есть ли у экспертов Core-Data какое-то понимание? но основная причина до сих пор неизвестна. У меня есть несколько автоматических миграций, которые есть в этой версии, и похоже, что, хотя некоторые из NSManagedObjects можно читать, другие выдают это исключение, особенно в отношении NSManagedObjects. Возможно, это вообще не связано с PlayerController. Есть ли у экспертов Core-Data какое-то понимание?



ОБНОВЛЕНИЕ 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];
    }
}

Чтобы объяснить, что я сделал для его воспроизведения, мне нужно немного объяснить структуру данных. У меня есть элементы Mix и Audio . У миксов много аудио, аудио принадлежит многим миксам. Это простой вызов отношения к объектам MixAudio для получения Audio. Теперь это происходит только здесь после , когда я выполняю восстановление базы данных до новой версии.

Резервное копирование базы данных в моей настройке означает заархивирование базы данных для сохранения данных, а затем разархивирование при восстановлении. Этот сбой происходит только после процесса восстановления. Чтобы усложнить задачу, есть 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, если это помогает. Я потерялся здесь.

терпят неудачу только старые выборки (которые были в БД до восстановления).

Если я не поймаю ошибку, консоль напечатает:

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, если это помогает. Я потерялся здесь.

только старые выборки (которые были в БД до восстановления) терпят неудачу.

Если я не поймаю ошибку, консоль напечатает:

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

Я был прав насчет управления версиями :) Я перечитал раздел о версиях в книге Зарры , и у меня был важный момент DOH . Это первый раз, когда у меня было приложение с тремя версиями базы данных. Я использую модели сопоставления в своем приложении и наивно предполагал, что основные данные можно будет сопоставить с 1-2, используя одну модель, а затем 2-3, используя следующую. Я буквально ударился головой, когда понял, что у меня нет модели отображения 1-3. Чтобы проверить это, я быстро добавил один, и все стало гладким, как масло. Теперь мне просто нужно вернуться и использовать его Progressive Data Migration образцы, чтобы облегчить себе жизнь, поскольку я продолжаю работать с новой версией этой БД.

Я надеюсь, что Зарра проезжает сюда и что-то ответит ... что угодно ... так что я могу дать ему за это очки :)

6
задан westsider 23 March 2011 в 23:02
поделиться