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!
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
nie używaj -Os w ogóle, trzymaj się z ustawieniem domyślnym (O3). – LearnCocos2D