2013年12月21日土曜日

CocosBuilderで作成するとReleaseビルドでクラッシュする

何気なくCocosBuilderで検索していたところ、下記のようなブログの投稿を発見しました。

Taiatari さんのブログで、
CocosBuilderにリジェクトの罠!このバグ致命的!

同じような問題が、他に投稿されていないかと検索してみたところ、

cocos2d iphone の公式サイトのフォーラムに、

iPad project using CocosBuilder fails release, runs debug

という投稿がありました。

今年、2013年の5月に投稿されていたようで、今頃になって見つけてしまいました。
私も、CocosBuilderの2.1でアプリを制作していまして申請直前でしたので、助かりました。
これからは、こまめにチェックしておかないといけないですね。
どうも、ありがとうございます。

自分のアプリをReleaseで実機 iPodTouch 4th iOS6.1.5 で実行させたところ。
見事にクラッシュしました。
Organizerのデバイスログで見ると、

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   hoge-iOS                 0x000d74b8 -[CCBReader readFloat] (CCBReader.m:199)

やはり、CCBReader.m のメソッド readFloat で落ちているみたいです。
上記の公式サイトの投稿によると readHeader も修正したほうがよさそうです。

readHeader 修正後
- (BOOL) readHeader
{
    // if no bytes loaded, don't crash about it.
    if( bytes == nil) return NO;
    // Read magic
    int magic;
    unsigned char* pData = ( bytes + currentByte );
    //    int magic = *((int*)(bytes+currentByte));
    memcpy( &magic, pData, sizeof( int ) );
    currentByte+=4;
    if (magic != 'ccbi') return NO;
    
    // Read version
    int version = [self readIntWithSign:NO];
    if (version != kCCBVersion)
    {
        NSLog(@"CCBReader: Incompatible ccbi file version (file: %d reader: %d)",version,kCCBVersion);
        return NO;
    }
    
    return YES;
}
 readFloat 修正後
- (float) readFloat
{
    unsigned char type = [self readByte];
    
    switch (type) {
        case kCCBFloat0:
            return 0;
        case kCCBFloat1:
            return 1;
        case kCCBFloatMinus1:
            return -1;
        case kCCBFloat05:
            return 0.5f;
        case kCCBFloatInteger:
            return [self readIntWithSign:YES];
        default: {
            // using a memcpy since the compiler isn't
            // doing the float ptr math correctly on device.
            float f = 0;
            unsigned char* pData = (bytes + currentByte);
            memcpy(&f, pData, sizeof(float));
            currentByte+=4;
            return f;
        }
    }
}
 このバグの原因は、armv7のメモリアロケートにあるらしいのですが…
…よく理解できませんでした。勉強し直します。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。