Dostaję dziwny błąd od niektórych moich testerów wersji beta, z którymi mam problem. Symptomowe raporty o awariach wskazują, że wystąpił błąd w prostej alokacji kontrolera jako singleton, podczas wywołania init, ale według śladu stosu okazuje się, że kod, który mam w
Awaria Strange Core Data z _Unwind_SjLj_Resume po migracjiinit
, nie znajduje się w miejscu wypadku. Oto odpowiedni kod:
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| }
To nigdy nie rozbił się, a kod nie zmienił się w ostatnim czasie. Oto przykładowy ślad stosu:
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
…
Jakieś pomysły dotyczące tego, czym jest ta tajemnicza awaria i skąd może pochodzić?
UPDATE 1
Wydaje się, że ma do czynienia z danymi podstawowymi i migracje. Udało mi się to zduplikować, ale główna przyczyna jest wciąż nieznana. Mam kilka automatycznych migracji, które są w tej wersji i wygląda na to, że podczas gdy niektóre z NSManagedObjects można odczytać, inne rzucają ten wyjątek, szczególnie w relacji NSManagedObjects. To może nie być w ogóle związane z
PlayerController
. Wszyscy eksperci Core-Data mają pewien wgląd?
UPDATE 2
Oto stos wywołań od katastrofy po tym, jak znaleźli sposób, aby odtworzyć go
i odpowiedni kod:
if (resultArray && [resultArray count]) {
for (MixAudio *ma in resultArray) {
Audio *audio = [ma valueForKey:LOCAL_MIX_AUDIO_AUDIO_KEY];
if (audio) {
[returnArray addObject:audio];
}
}
Aby pomóc wyjaśnij, co zrobiłem, aby go odtworzyć, muszę wyjaśnić trochę strukturę danych. Mam pozycje: Mix
i Audio
. Miksy mają wiele audio, audio należy do wielu miksów. Jest to proste wywołanie relacji na obiektach MixAudio, aby uzyskać dźwięk. Teraz to tylko uległo awarii tutaj po Wykonuję przywracanie bazy danych do nowej wersji.
Kopie zapasowe baz danych w mojej konfiguracji oznaczają zapakowanie bazy danych w celu zapisania danych, a następnie rozpakowanie przy przywracaniu. Ta awaria ma miejsce tylko po przywróceniu. Aby było bardziej skomplikowane, istnieją 3 wersje baz danych z modelami odwzorowania. Ponieważ ten proces pracował dla mnie przed wersją, uważam, że coś w moich wersjach powoduje tę awarię.
Wszystkie pozostałe dane są w porządku i można uzyskać do nich dostęp, a nawet zapisać. W jakiś sposób to pojedyncze pobranie powoduje problemy. Podczas konfigurowania magazynu trwałego lub modelu obiektów zarządzanych nie występują żadne błędy ani ostrzeżenia. Co więcej, można tworzyć nowe obiekty Mix i uzyskiwać do nich dostęp w porządku, ale kończą się tylko starsze pobory (które były w DB przed przywróceniem).
Jeśli nie złapać błąd drukuje konsoli:
Assertion failed: (_Unwind_SjLj_Resume() can't return), function _Unwind_SjLj_Resume, file /SourceCache/libunwind/libunwind-24.1/src/Unwind-sjlj.c, line 326.
Umieszczenie try/catch
wokół linii upaść pozwala mi sprawdzić przyczynę awarii:
Error: NSRangeException: *** -[NSMutableArray objectAtIndex:]: index 4294967295 beyond bounds [0 .. 16]
ale to sprawia, nie ma sensu (przynajmniej dla mnie) dla prostego połączenia valueForKey
. 4294967295 = 2^32-1 co oznacza, że indeks var był prawdopodobnie ustawiony na -1, jeśli to pomaga. Jestem tutaj zagubiony.
[SOLVED] UPDATE 3
miałem rację o to czy jest w wersjonowanie :) ja ponownie przeczytać sekcję wersjonowanie w Zarra's book i miał ogromny DOH chwilę. To pierwszy raz, kiedy miałem aplikację z 3 wersjami baz danych. Korzystam z modeli mapowania w mojej aplikacji i naiwnie zakładałem, że podstawowe dane będą mogły być odwzorowane z 1-2 przy użyciu jednego modelu, a następnie 2-3 przy następnym. Dosłownie uderzyłem się w głowę, gdy zdałem sobie sprawę, że nie mam modelu odwzorowania 1-3. żeby to przetestować, dodałem jeden szybko i wszystko jest tak gładkie jak masło. Teraz po prostu muszę wrócić i użyć jego próbek
Progressive Data Migration
, aby ułatwić sobie życie, gdy będę kontynuował z większą wersją tego DB.
Mam nadzieję Zarra jeździ tędy i odpowiedzi coś ... coś ... więc mogę dać mu punkty za to :)
Czy na pewno zdefiniowano LOCAL_MIX_AUDIO_AUDIO_KEY dla obiektu audio? -1 to NSNotFound, więc system może decydować, że klucz nie istnieje i mimo to próbuje go znaleźć. Może coś nie jest poprawnie migrowane. – ughoavgfhw
Ya, jego definicja ... Właśnie to wymyśliłem i aktualizuję pytanie. – coneybeare