2013-03-03 154 views
5

所以我一直在这个非常奇怪和烦人的问题卡了几天。所以我有一个应用程序,我发布到iOS应用程序商店,我最近回去并为应用程序添加了一些额外的功能。我没有触及应用程序的核心,只是在应用程序购买中添加了twitter,facebook,以及谷歌admob(基于完整版本的免费版本)。所以这里就是奇怪的地方。我测试了我的更新,我做了一个adhoc发布版本,并在我的iphone 3gs,4s,ipad 2上测试 - 完全没有问题。我提交给苹果,他们批准更新并发布。我更新了应用程序并尝试运行它并在启动屏幕后立即出现崩溃(此处没有任何更改)。我的项目使用cocos2dx框架(版本cocos2d-2.0-x-2.0.4 @ Nov 02 2012),我使用cocosbuilder(2.1)。我查看了日志,它似乎是CCBReader :: readFloat()函数内部的未对齐问题。我发现这里有一个修复:https://github.com/DarraghCoy/cocos2d-x/commit/34b31fd754778f815fcac108089e3fe015e2e2b9。因此,我继续修改我的默认情况,以及从此: float CCBReader :: readFloat(){ unsigned char type = this-> readByte();Cocos2dx iOS认证应用程序崩溃

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

要这样:

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

再次测试设备上没有isses发布版本。我向苹果提交了此修复程序,并要求加快审核,以便应用程序可以运行而不会崩溃,并在1天内获得苹果批准并发运出去。我更新到新版本发布并再次崩溃。

这里是崩溃日志的副本:

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: 

我做modifie另一个接头标志,包括-lsqlite3.0和-ObjC(最初这只是-lxml2和-lz)。我的发布版本优化是-Os(最快,最小)。

其他人有这个问题吗?我不知道如何调试,因为我不能repro。最后,苹果如何批准应用程序,但它在启动画面后立即崩溃?如果我能猜出运行该应用程序的时间是否有效,并且可能会在它抛出“Processing for App Store”阶段发布应用程序批准(不确定)时被破坏。

谢谢!

回答

0

我很喜欢“跆拳道是CCB在那里?” ....无论如何,尝试与-O3或根本没有优化。已知-Os会引起微妙的问题,尤其是在使用cocos2d时。有一个原因,为什么-Os不是cocos2d的默认级别(我也相信Xcode模板)。

如果解决了该问题,则可以使用此question的答案之一设置优化级别或仅对此文件或函数禁用优化。

+0

嗨LearnCocos2D,谢谢你的回复。所以我认为我会继续努力推动此更新再次抛出,而不进行优化。我跑了我打算提交的发布版本,看看是否有任何明显的差异,游戏仍然运行相同我在iPhone 4s上测试ipad视网膜会表现得更慢吗?优化工作有哪些改变?在我的下一次更新中,我应该重新启用-Os优化,并执行此操作。 CCBReader :: readFloat(); #pragma GCC pop_options – kub 2013-03-03 16:53:23

+0

完全不使用-Os,坚持使用默认值(O3)。 – LearnCocos2D 2013-03-04 00:48:27

2

我的第一个反应是,根据你的陈述结束,苹果声称已解决的'应用程序更新错误'尚未完全解决。在更新期间添加的DRM修补程序以某种方式在启动时立即崩溃更新的应用程序。 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

已经有很多类似的问题问有关应用程序更新崩溃的bug。有一些最佳实践或解决方法,苹果公司没有特别说明避免更新错误。检查出来。如果它不是特定于您的应用的,它们中的一个可能会适合您。

Updated App Crashing on iPad iPhone app crash immediately after update

2

关于CCBReader EXC_BAD_ACCESS错误,这篇文章帮我完全一样的问题: http://www.cocos2d-x.org/boards/6/topics/18183

事实证明,这是挂在CCBReader记忆偏差,这将SIM​​卡上运行良好,但由于其ARM处理器会在设备上崩溃。

2

我知道一个解决方法。编辑该计划建立Debug而不是Release,它似乎并没有炸毁。

我也有两个拒绝。诀窍是我有一个版本(免费)的应用程序通过,另一个(PREMIUM)崩溃。我追逐了这种差异,并证实了这种差异。

CCBReader 2.0

调试/发布的副作用是可能的优化,@ LearnCocos2D提及。


优化解决方法:

  • 选择目标。
  • 选择Build Phases选项卡。
  • 展开编译源项目。 它应该列出所有编译的文件。如果您注意到顶部有第二栏“编译器标志”。
  • 选择CCBReader.m
  • 双击编译器标志柱
  • 进入 “-O0”

解决了这个问题对我来说。

0

您正在使用ccbi文件来创建用户界面,您的游戏随机崩溃是因为您没有将您的引用变量设置为您的类的init方法中的nullptr。

例如我声明Label * homeLabel;在intorScene.h文件中,在.cpp文件的init方法中,您应该将此变量设置为

homeLabel = nullptr;