2011-01-07 12 views
6

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 init, nie znajduje się w miejscu wypadku. Oto odpowiedni kod: Awaria Strange Core Data z _Unwind_SjLj_Resume po migracji

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 alt text
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 :)

+1

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

+0

Ya, jego definicja ... Właśnie to wymyśliłem i aktualizuję pytanie. – coneybeare

Odpowiedz

2

Podczas gdy PO była w stanie rozwiązać swoje własne pytanie, warto mieć wyraźny zrozumienie migracji.

Po utworzeniu drugiej wersji modelu danych potrzebny jest model odwzorowania od wersji pierwszej do drugiej.

Podczas tworzenia trzeciego modelu potrzebny jest model odwzorowania od jednego do dwóch i mapy od jednego do trzech.

Po dodaniu czwartego modelu potrzebne są następujące modele:

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

I robi się tam większy postęp.

+0

Drogi Markusie, proszę odpowiedzieć na http://stackoverflow.com/questions/18859083/core-data-strange-crash-w-o3-optimization -level? – user170317

Powiązane problemy