2013-03-03 21 views
5

Tak więc utknąłem przez kilka dni na tym niezwykle dziwnym i denerwującym problemie. Mam więc aplikację, którą opublikowałem w sklepie z aplikacjami ios, a ostatnio wróciłem i dodałem kilka dodatkowych funkcji do aplikacji. Nie dotknąłem rdzenia aplikacji, tylko dodałem rzeczy takie jak twitter, facebook, w zakupach aplikacji i google admob (dla wersji darmowej, która jest oparta na pełnej wersji). A więc tu jest dziwnie. Przetestowałem moją aktualizację Zrobiłem build wersji adhoc i przetestowałem na moim iPhone 3gs, 4s, ipad 2 - żadnych problemów w ogóle. Przekazałem jabłko, że zatwierdzili aktualizację i została ona wydana. Zaktualizowałem aplikację i próbowałem ją uruchomić, a boom zawiesza się zaraz po ekranie powitalnym (znowu nic się tu nie zmieniło). Mój projekt wykorzystuje framework cocos2dx (wersja cocos2d-2.0-x-2.0.4 @ Nov 02 2012) i korzystam z cocosbuilder (2.1). Spojrzałem na dziennik i wydawało się, że jest to kwestia braku wyrównania wewnątrz funkcji CCBReader :: readFloat(). Stwierdziłem, że tutaj jest poprawka: https://github.com/DarraghCoy/cocos2d-x/commit/34b31fd754778f815fcac108089e3fe015e2e2b9.Cocos2dx iOS Zatwierdzona aplikacja Crashing

Więc poszedłem dalej i zmodyfikowałem mój domyślny przypadek z tego: float CCBReader :: readFloat() { unsigned char type = this-> readByte();

 switch (type) { 
      case kCCBFloat0: 
       return 0;  
      case kCCBFloat1: 
       return 1; 
      case kCCBFloatMinus1: 
       return -1; 
      case kCCBFloat05: 
       return 0.5f; 
      case kCCBFloatInteger: 
       return (float)this->readInt(true); 
      default: 
       { 
        /* using a memcpy since the compiler isn't 
        * doing the float ptr math correctly on device. 
        * TODO still applies in C++ ? */ 
        float * pF = (float*)(this->mBytes + this->mCurrentByte); 
        float f = 0; 

        memcpy(&f, pF, sizeof(float)); 
        this->mCurrentByte += 4; 

        return f; 
       } 
     } 
    } 

do tego:

float CCBReader::readFloat() { 
     unsigned char type = this->readByte(); 

     switch (type) { 
      case kCCBFloat0: 
       return 0;  
      case kCCBFloat1: 
       return 1; 
      case kCCBFloatMinus1: 
       return -1; 
      case kCCBFloat05: 
       return 0.5f; 
      case kCCBFloatInteger: 
       return (float)this->readInt(true); 
      default: 
       { 
        /* using a memcpy since the compiler isn't 
        * doing the float ptr math correctly on device. 
        * TODO still applies in C++ ? */ 
        float * pF = (float*)(this->mBytes + this->mCurrentByte); 
        float f = 0; 

        memcpy((void*) &f, (const void*) pF, sizeof(float)); 

        this->mCurrentByte += sizeof(float); 


        return f; 
       } 
     } 
    }   

Znowu testowanie kompilacji uwolnienia na urządzeniach żadnych isses. Przesłałem tę poprawkę do Apple i poprosiłem o przyspieszoną recenzję, aby aplikacja działała zamiast awaryjnie i uzyskała zgodę Apple w ciągu 1 dnia i została wysłana. Aktualizuję nową wersję i znowu się zawiesza.

Oto kopia dziennika katastrofy:

Incident Identifier: DCFEA2A4-9707-4FF7-A4B7-26CF61B4A73F 
CrashReporter Key: b91e2f134184158618753244f837ff2ac5114f0d 
Hardware Model:  iPhone4,1 
Process:   GAMEAPP [848] 
Path:   /var/mobile/Applications/F860F02C-3D16-4995-A19F-CE036200209F/GAMEAPP.app/GAMEAPP 
Identifier:  GAMEAPP 
Version:   ??? (???) 
Code Type:  ARM (Native) 
Parent Process: launchd [1] 

Date/Time:  2013-03-01 19:42:44.987 -0500 
OS Version:  iOS 6.1.2 (10B146) 
Report Version: 104 

Exception Type: EXC_BAD_ACCESS (SIGBUS) 
Exception Codes: EXC_ARM_DA_ALIGN at 0x1f0807c9 
Crashed Thread: 0 

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0 Crashed: 
0 GAMEAPP      0x000f971c cocos2d::extension::CCBReader::readFloat() (CCBReader.cpp:422) 
1 GAMEAPP      0x000f9e52 cocos2d::extension::CCBReader::readKeyframe(int) (CCBReader.cpp:648) 
2 GAMEAPP      0x000f99ae cocos2d::extension::CCBReader::readNodeGraph(cocos2d::CCNode*) (CCBReader.cpp:509) 
3 GAMEAPP      0x000f9c20 cocos2d::extension::CCBReader::readNodeGraph(cocos2d::CCNode*) (CCBReader.cpp:586) 
4 GAMEAPP      0x000f9342 cocos2d::extension::CCBReader::readFileWithCleanUp(bool) (CCBReader.cpp:689) 
5 GAMEAPP      0x000f92ec cocos2d::extension::CCBReader::readNodeGraphFromData(cocos2d::extension::CCData*, cocos2d::CCObject*, cocos2d::CCSize const&, cocos2d::extension::CCBAnimationManager**) (CCBReader.cpp:230) 
6 GAMEAPP      0x000f91aa cocos2d::extension::CCBReader::readNodeGraphFromFile(char const*, cocos2d::CCObject*, cocos2d::CCSize const&, cocos2d::extension::CCBAnimationManager**) (CCBReader.cpp:213) 
7 GAMEAPP      0x000f90a4 cocos2d::extension::CCBReader::readNodeGraphFromFile(char const*, cocos2d::CCObject*) (CCBReader.cpp:192) 
8 GAMEAPP      0x00119b50 IntroScene::init() (IntroScene.cpp:55) 
9 GAMEAPP      0x00119ca8 IntroScene::create() (IntroScene.h:19) 
10 GAMEAPP      0x00119a7c IntroScene::scene() (IntroScene.cpp:22) 
11 GAMEAPP      0x00110290 AppDelegate::applicationDidFinishLaunching() (AppDelegate.cpp:144) 
12 GAMEAPP      0x000dab94 cocos2d::CCApplication::run() (CCApplication.mm:50) 
13 GAMEAPP      0x000b6610 -[AppController application:didFinishLaunchingWithOptions:] (AppController.mm:76) 
14 UIKit       0x36522ad4 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 248 
15 UIKit       0x3652265e -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1186 
16 UIKit       0x3651a846 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 694 
17 UIKit       0x364c2c34 -[UIApplication handleEvent:withNewEvent:] + 1000 
18 UIKit       0x364c26c8 -[UIApplication sendEvent:] + 68 
19 UIKit       0x364c2116 _UIApplicationHandleEvent + 6150 
20 GraphicsServices    0x381d85a0 _PurpleEventCallback + 588 
21 GraphicsServices    0x381d81ce PurpleEventCallback + 30 
22 CoreFoundation     0x3468f170 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 32 
23 CoreFoundation     0x3468f112 __CFRunLoopDoSource1 + 134 
24 CoreFoundation     0x3468df94 __CFRunLoopRun + 1380 
25 CoreFoundation     0x34600eb8 CFRunLoopRunSpecific + 352 
26 CoreFoundation     0x34600d44 CFRunLoopRunInMode + 100 
27 UIKit       0x36519480 -[UIApplication _run] + 664 
28 UIKit       0x365162fc UIApplicationMain + 1116 
29 GAMEAPP      0x000b6c22 main (main.m:14) 
30 GAMEAPP      0x000b6344 start + 36 

Thread 1: 
0 libsystem_kernel.dylib   0x3c8d5d98 __workq_kernreturn + 8 
1 libsystem_c.dylib    0x3c823cf6 _pthread_workq_return + 14 
2 libsystem_c.dylib    0x3c823a12 _pthread_wqthread + 362 
3 libsystem_c.dylib    0x3c8238a0 start_wqthread + 4 

Thread 2 name: Dispatch queue: com.apple.libdispatch-manager 
Thread 2: 
0 libsystem_kernel.dylib   0x3c8c5648 kevent64 + 24 
1 libdispatch.dylib    0x3c7f5974 _dispatch_mgr_invoke + 792 
2 libdispatch.dylib    0x3c7f5654 _dispatch_mgr_thread$VARIANT$mp + 32 

Thread 3: 
0 libsystem_kernel.dylib   0x3c8d5d98 __workq_kernreturn + 8 
1 libsystem_c.dylib    0x3c823cf6 _pthread_workq_return + 14 
2 libsystem_c.dylib    0x3c823a12 _pthread_wqthread + 362 
3 libsystem_c.dylib    0x3c8238a0 start_wqthread + 4 

Thread 4 name: WebThread 
Thread 4: 
0 libsystem_kernel.dylib   0x3c8c4eb4 mach_msg_trap + 20 
1 libsystem_kernel.dylib   0x3c8c5048 mach_msg + 36 
2 CoreFoundation     0x3468f040 __CFRunLoopServiceMachPort + 124 
3 CoreFoundation     0x3468dd9e __CFRunLoopRun + 878 
4 CoreFoundation     0x34600eb8 CFRunLoopRunSpecific + 352 
5 CoreFoundation     0x34600d44 CFRunLoopRunInMode + 100 
6 WebCore       0x3a60a500 RunWebThread(void*) + 440 
7 libsystem_c.dylib    0x3c82e30e _pthread_start + 306 
8 libsystem_c.dylib    0x3c82e1d4 thread_start + 4 

Thread 5 name: AURemoteIO::IOThread 
Thread 5: 
0 libsystem_kernel.dylib   0x3c8c4eb4 mach_msg_trap + 20 
1 libsystem_kernel.dylib   0x3c8c5048 mach_msg + 36 
2 AudioToolbox     0x3418391c AURemoteIO::IOThread::Run() + 104 
3 AudioToolbox     0x34185c84 AURemoteIO::IOThread::Entry(void*) + 4 
4 AudioToolbox     0x340c3882 CAPThread::Entry(CAPThread*) + 294 
5 libsystem_c.dylib    0x3c82e30e _pthread_start + 306 
6 libsystem_c.dylib    0x3c82e1d4 thread_start + 4 

Thread 0 crashed with ARM Thread State (32-bit): 
    r0: 0x1ed49740 r1: 0x1f0807c9  r2: 0x000001cd  r3: 0x000001c8 
    r4: 0x00000004 r5: 0x1ed49740  r6: 0x42480000  r7: 0x2fd4af48 
    r8: 0xffffffff r9: 0x000001c9  r10: 0x1ed49740  r11: 0x1ed4a8a0 
    ip: 0x000001c7 sp: 0x2fd4af48  lr: 0x000f9e57  pc: 0x000f971c 
    cpsr: 0x00000030 

Binary Images: 

zrobiłem Modifié pozostałe flagi łącznikowe obejmuje -lsqlite3.0 i -ObjC (pierwotnie było tylko -lxml2 i -lZ). Moja optymalizacja kompilacji wersji to -Os (Najszybsza, Najmniejsza).

Ktoś jeszcze ma ten problem? Nie mam pojęcia, jak to debugować, ponieważ nie mogę repro. W końcu, jak to jest, że jabłko zatwierdza aplikację, ale ulega awarii zaraz po ekranie powitalnym? Jeśli uda mi się odgadnąć, kiedy uruchomi się aplikacja, może się zepsuje, gdy przejdzie do zatwierdzenia aplikacji na etapie "Processing for App Store" (nie jestem pewien).

Dzięki!

Odpowiedz

0

Byłem jak "WTF robi tam CCB?" .... w każdym razie spróbuj z -O3 lub bez optymalizacji. -Os powoduje subtelne problemy, szczególnie z cocos2d. Istnieje powód, dla którego -Os nie jest domyślnym poziomem dla cocos2d (i uważam, że również szablony Xcode).

Jeśli to rozwiąże problem, możesz ustawić poziom optymalizacji lub wyłączyć optymalizacje tylko dla tego pliku lub funkcji, korzystając z jednej z odpowiedzi tego question.

+0

Witaj LearnCocos2D, dziękuję za odpowiedź. Więc myślę, że pójdę dalej i spróbuję popchnąć tę aktualizację ponownie bez optymalizacji. Uruchomiłem wersję, którą planuję przesłać, aby zobaczyć, czy są jakieś nieistotne różnice, a gra wciąż działa tak samo, jak testowałem na iPhone 4s czy retina zachowa się wolniej? Jakie zmiany dokonuje optymalizacja -O? Również na mojej następnej aktualizacji powinienem ponownie włączyć optymalizację -Os i zrobić to #pragma GCC push_options #pragma GCC zoptymalizować ("O0") CCBReader :: readFloat(); #pragma GCC pop_options – kub

+0

nie używaj -Os w ogóle, trzymaj się z ustawieniem domyślnym (O3). – LearnCocos2D

2

Moja pierwsza reakcja, oparta na stwierdzeniach pod koniec, jest taka, że ​​"błąd aktualizacji aplikacji", który według Apple rozwiązał, nie został jeszcze rozwiązany. Poprawka DRM, która jest dodawana podczas aktualizacji, w jakiś sposób powoduje awarię zaktualizowanych aplikacji natychmiast po uruchomieniu. http://www.tuaw.com/2013/03/01/bug-in-latest-evernote-for-ios-update-causes-the-app-to-crash/ https://discussions.apple.com/thread/3389977?start=0&tstart=0 http://www.pcworld.com/article/258827/updated_apps_crashing_heres_what_you_need_to_know.html

Było wiele podobnych pytań zadawanych związane z aktualizacji App wypadku błędu. Istnieją pewne najlepsze praktyki lub rozwiązania, które nie zostały udokumentowane przez firmę Apple, w szczególności unikając błędu aktualizacji. Sprawdź je. Jeden z nich może ćwiczyć dla Ciebie, jeśli nie jest to coś konkretnego dla Twojej aplikacji.

Updated App Crashing on iPad iPhone app crash immediately after update

2

Ten post odnośnie błędów EXC_BAD_ACCESS w CCBReader pomógł mi z dokładnie tej samej kwestii: http://www.cocos2d-x.org/boards/6/topics/18183

Okazuje się, że jest ono związane z niedopasowania pamięci w CCBReader która będzie działać dobrze na sim , ale zawiesi się na urządzeniu z powodu jego procesora ARM.

2

Znam sposób obejścia problemu. Zmodyfikuj schemat tak, aby był zbudowany pod Debug, a nie Release i wydaje się, że nie wysadza się w powietrze.

Miałem też dwie odrzucenia. Sztuczka polegała na tym, że miałem jedną wersję (BEZPŁATNIE) aplikacji, która przeszła, a druga (PREMIUM) uległa awarii. Pogoniłem tę różnicę i potwierdziłem tę różnicę.

CCBReader 2,0

Efektem ubocznym debugowania/uwalnianiu jest ewentualnie optymalizacji jako @ LearnCocos2D wymienione.


Optymalizacja obejście:

  • Wybierz cel.
  • Wybierz zakładkę Fazy tworzenia.
  • Rozwiń pozycję Źródła kompilacji. Powinien on zawierać listę wszystkich skompilowanych plików. Jeśli zauważysz na górze, znajduje się druga kolumna "Flagi kompilatora".
  • Wybierz CCBReader.m
  • Kliknij dwukrotnie kolumnę flag kompilatora
  • Enter "-O0"

rozwiązany problem dla mnie.

0

używasz plików ccbi do tworzenia interfejsu użytkownika, Twoja gra ulega awarii losowo, ponieważ nie ustawiasz zmiennej referencyjnej na nullptr w metodzie init swojej klasy.

Dla przykładu i zadeklarowałem Label * homeLabel; w pliku intorScene.h, w metodzie init pliku .cpp należy ustawić tę zmienną na

homeLabel = nullptr;

Powiązane problemy