Странный сбой базовых данных с _Unwind_SjLj_Resume после миграции - PullRequest
6 голосов
/ 07 января 2011

Я получаю странный сбой от некоторых из моих бета-тестеров, с которыми у меня проблемы. Символические отчеты о сбоях указывают на то, что сбой происходит при простом выделении контроллера как одиночного при вызове 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 есть понимание?



ОБНОВЛЕНИЕ 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 для получения аудио. Теперь, это только сбой здесь после Я делаю восстановление базы данных до новой версии.

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

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

1 Ответ

2 голосов
/ 10 января 2011

Хотя ОП смог решить свой собственный вопрос, полезно иметь четкое представление о миграциях.

Когда вы создаете вторую версию своей модели данных, вам нужна модель отображения из первой версиидо версии 2.

Когда вы создаете третью модель, вам нужна модель сопоставления от одного до двух И карта от одного до трех.

Когда вы добавляете четвертую модельДля модели необходимы следующие модели:

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

И оттуда он получает больше прогресса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...