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

Я получаю странный сбой от некоторых из моих бета-тестеров, с которыми у меня возникли проблемы. Символические отчеты о сбоях указывают на то, что сбой происходит при простом выделении контроллера как одноэлементного при вызове инициализации, но, согласно трассировке стека, кажется, что код, который у меня есть в 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
Вот стек вызовов сбоя после того, как я нашел способ воспроизвести его< img src="https://i.stack.imgur.com/eboru.png" alt="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, что означает, что переменная индекса, вероятно, была установлена ​​​​на -1, если это поможет. Я потерялся здесь.





[РЕШЕНО] ОБНОВЛЕНИЕ 3
Я был прав насчет версий :) Я перечитал раздел о версиях в < href="https://rads.stackoverflow.com/amzn/click/com/1934356328" rel="nofollow noreferrer" rel="nofollow noreferrer">книгу Зарры и имел большой DOH< /сильный> момент. Это первый раз, когда у меня было приложение с 3 версиями базы данных. Я использую модели сопоставления в своем приложении и наивно предполагал, что основные данные смогут отображать 1-2 с использованием одной модели, а затем 2-3 с использованием следующей. Я буквально ударился головой, когда понял, что у меня нет модели отображения 1-3. чтобы проверить это, я быстро добавил один, и все так же гладко, как по маслу. Теперь мне просто нужно вернуться и использовать его Progressive Data Migration семплов, чтобы облегчить себе жизнь, поскольку я продолжаю работать с новой версией этой БД.

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


person coneybeare    schedule 07.01.2011    source источник
comment
Вы уверены, что LOCAL_MIX_AUDIO_AUDIO_KEY определен для объекта Audio? -1 равно NSNotFound, поэтому система может решить, что ключ не существует, и все равно попытается его найти. Может быть, что-то не мигрирует должным образом.   -  person ughoavgfhw    schedule 10.01.2011
comment
Да, это определено ... Я только что понял и обновляю вопрос.   -  person coneybeare    schedule 10.01.2011


Ответы (1)


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

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

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

При добавлении четвертой модели вам понадобятся следующие модели:

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

И от этого прогресса становится больше.

person Marcus S. Zarra    schedule 10.01.2011
comment
Уважаемый Маркус, не могли бы вы ответить на stackoverflow.com/questions/18859083/ ? - person user170317; 18.09.2013