2013-03-03 6 views
5

Quindi sono rimasto bloccato per un paio di giorni su questo problema estremamente strano e fastidioso. Quindi ho un'app che ho rilasciato all'app store ios e di recente sono tornato e ho aggiunto alcune funzionalità extra all'applicazione. Non ho toccato il cuore dell'app ma ho aggiunto cose come Twitter, Facebook, negli acquisti di app e google admob (per la versione gratuita basata sulla versione completa). Quindi qui è dove le cose vanno strane. Ho testato il mio aggiornamento, ho creato un build ad hoc e testato sul mio iphone 3gs, 4s, ipad 2 - nessun problema. Ho presentato a Apple hanno approvato l'aggiornamento ed è stato rilasciato. Ho aggiornato l'applicazione e ho provato a eseguirla e boom si blocca subito dopo la schermata iniziale (di nuovo nulla è stato modificato). Il mio progetto utilizza il framework cocos2dx (versione cocos2d-2.0-x-2.0.4 @ Nov 02 2012) e io uso cocosbuilder (2.1). Ho guardato il log e sembrava essere un problema di disallineamento all'interno della funzione CCBReader :: readFloat(). Ho trovato che c'era una soluzione a questo qui: https://github.com/DarraghCoy/cocos2d-x/commit/34b31fd754778f815fcac108089e3fe015e2e2b9.Cocos2dx iOS Approved App Crashing

Così sono andato avanti e modificato il mio caso di default, così da questo: float CCBReader :: readFloat() {unsigned tipo char = 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; 
       } 
     } 
    } 

A tal:

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; 
       } 
     } 
    }   

Anche in questo caso la prova di un build di rilascio su dispositivi non isses. Ho inviato questa correzione a Apple e ho richiesto una revisione accelerata in modo che l'applicazione venisse eseguita anziché arrestarsi in modo anomalo e avesse ottenuto l'approvazione Apple entro 1 giorno e sia stata spedita. Aggiornamento alla nuova versione e il suo arresto anomalo.

Ecco una copia del registro blocchi:

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: 

ho fatto Modifié le altre bandiere linker per includere -lsqlite3.0 e -ObjC (in origine era solo -lxml2 e -lz). Il mio ottimizzazione per la creazione di release è -Os (più veloce, più piccolo).

Qualcun altro ha questo problema? Non ho idea di come eseguire il debug di questo dato che non posso riprodurre. Infine, com'è che Apple approva l'app, ma si blocca subito dopo la schermata iniziale? Se riesco a indovinare quando funziona, l'app funziona e forse si rompe quando va a gettare l'approvazione della fase di elaborazione "Stage for App Store" (non sicura).

Grazie!

risposta

0

Ero tipo "WTF è CCB che sta facendo?" .... comunque, prova con -O3 o nessuna ottimizzazione. -Os è noto per causare problemi sottili, in particolare con cocos2d. C'è una ragione per cui -Os non è il livello predefinito per cocos2d (e credo che anche i modelli Xcode).

Se questo risolve il problema, è possibile impostare il livello di ottimizzazione o disattivare le ottimizzazioni solo per questo file o funzione utilizzando una delle risposte di questo question.

+0

Ciao LearnCocos2D, grazie per la tua risposta. Quindi penso che andrò avanti e cercherò di spingere questo aggiornamento di nuovo senza ottimizzazioni. Ho eseguito la versione di rilascio che ho intenzione di inviare per vedere se ci sono differenze notificabili e il gioco continua a girare lo stesso che ho provato su un iPhone 4: l'ipad retina si comporterebbe più lentamente? Che cosa cambia l'ottimizzazione dell'OS? Anche sul mio prossimo aggiornamento dovrei riattivare l'ottimizzazione di -Os e fare questo #pragma GCC push_options #pragma GCC optimize ("O0") CCBReader :: readFloat(); #pragma GCC pop_options – kub

+0

non utilizzare -Os affatto, attenersi al predefinito (O3). – LearnCocos2D

2

La mia prima reazione, basata sulle vostre dichiarazioni verso la fine, è che il "bug di aggiornamento app" che Apple ha affermato di aver risolto non è ancora completamente risolto. La patch DRM che viene aggiunta durante l'aggiornamento, blocca in qualche modo le app aggiornate immediatamente all'avvio. 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

Ci sono state molte domande simili asked correlati a UPDATE App incidente bug. Esistono alcune best practice o soluzioni alternative, non documentate da Apple specificamente per evitare il bug di aggiornamento. Controllali. Uno di questi potrebbe allenarti per te, se non è qualcosa di specifico per la tua app.

Updated App Crashing on iPad iPhone app crash immediately after update

2

Questo post per quanto riguarda gli errori EXC_BAD_ACCESS in CCBReader mi ha aiutato con la stessa identica questione: http://www.cocos2d-x.org/boards/6/topics/18183

Risulta, era legato al disallineamento di memoria in CCBReader che verrà eseguito bene su sim , ma si bloccherà su un dispositivo a causa del suo processore ARM.

2

Conosco una soluzione alternativa. Modifica lo schema da compilare per Debug e non Release e sembra non esplodere.

Ho avuto anche due rifiuti. Trick era che avevo una versione (GRATUITA) del passaggio dell'app e l'altro arresto (PREMIUM). Ho inseguito quella differenza e confermato la differenza.

CCBReader 2.0

L'effetto collaterale di Debug/Release è forse l'ottimizzazione, come @ LearnCocos2D menzionato.


Ottimizzazione soluzione:

  • Selezionare il bersaglio.
  • Selezionare la scheda Fasi di creazione.
  • Espandere l'elemento Origini di compilazione. Dovrebbe elencare tutti i file compilati. Se noti in alto c'è una seconda colonna "Compiler Flags".
  • Selezionare CCBReader.m
  • doppio clic sulla colonna del compilatore Flags
  • immettere "-O0"

risolto il problema per me.

0

si stanno utilizzando i file ccbi per creare l'interfaccia utente, il gioco si blocca in modo casuale a causa del fatto che non si imposta la variabile di riferimento su nullptr nel metodo init della classe.

Per esempio ho dichiarato Label * homeLabel; nel file intorScene.h, nel metodo init del file .cpp è necessario impostare questa variabile su

homeLabel = nullptr;