-1

私はCocos2d2.0ゲームを開発していますが、アプリがクラッシュする理由を静かに回避することはできません。

コンソール出力は次のとおりです。

2013-02-08 10:52:08.298 AppName[994:15203] cocos2d: CCSpriteBatchNode: resizing TextureAtlas capacity from [29] to [40].
2013-02-08 10:52:08.299 AppName[994:15203] cocos2d: CCSpriteBatchNode: resizing TextureAtlas capacity from [40] to [54].
2013-02-08 10:52:08.300 AppName[994:15203] cocos2d: CCSpriteBatchNode: resizing TextureAtlas capacity from [54] to [73].
(lldb) 

「ゲームシーン」が読み込まれ、すぐにクラッシュします。これはCCSpriteBatchNodeに関係していることがわかりますが、コードがどこで失敗するのかまったくわかりません。ブレークポイントを追加すると、失敗する正確な瞬間に到達する前に何度もトリガーされるため、あまり役に立ちません。

(lldb)はどういう意味ですか?より明示的なスタックトレースを作成する方法はありますか?以前はJavaとEclipseで作業していましたが、スタックトレース全体を英語で読むことができました。XCodeを使用した場合と同じように簡単にできればと思います。

4

1 に答える 1

1

あなたはおそらくそれらの厄介なEXC_BAD_ACCESSバガーの1つを手に入れています。いいえ、例外はありません。例えば

@try {

//        this is caught
//        NSMutableArray *ar = [NSMutableArray array];
//        [ar addObject:nil];

//        this is caught
//        NSMutableDictionary *dic = [NSMutableDictionary dictionary] ;
//        [dic setObject:@"a" forKey:nil];

//    this crashes , no exception
//    NSLog("21");

//    and this will cause a message sent to a dealloced instance (zombie).
//    no exception, just a bad crash.

    GEIntEffect *eff = [GEIntEffect intEffectWithString:@"*1.1"
                                              withOrder:geEffectOrderFightMagic
                                              andImpact:geEffectImpactPositive];
    [eff release];
    NSLog([eff description]);


    [[GameSpecs sharedGameSpecs] setupBattlesInitialSpecs];
    // with  a comment
}

@catch (NSException *e) {
    MPLOGERROR(@"*** an exception [%@] occured while writing the game specs, continuing.\n%@\n\n%@",
    e.description,
    e.callStackSymbols,
    e.callStackReturnAddresses);
}

最初の2つはトラップされ、logステートメントは明示的であり、ログにスタックトレースを吐き出します。NSLog( "21")...おっと、"@"がひどくクラッシュするのを忘れました。4番目の例は、使用前にオブジェクトを誤って解放します...よく、それが何をするかを知っています。私はあなたにしか提案できません:

  • すべての警告を確認してください(悪いNSLogに警告がありました)
  • 楽器を使用して、ゾンビのアプリをプロファイリングします。割り当て解除されたオブジェクトに送信されたメッセージも厄介にクラッシュします。
  • パフォーマンスの低下がありますが、やりすぎないでください。戦略的に配置されたtry/catchブロックは非常に役立ちます。通常、デバッグで「update」メソッドをラップし、リリースでtry/catchを削除します。
  • すべての警告を再確認してください:)

幸運を祈ります。

ps:例外をトラップしたときのログは次のようになります。オフセットは「コード行」ではなく、シンボリック化により可能になります。しかし、通常、私はトレースからそれを実際に閉じるのに十分な情報を持っています。:

-[MPGameSequencer sequenceInitState]:*例外[* -[__ NSArrayM insertObject:atIndex:]:オブジェクトをnilにすることはできません]がゲーム仕様の書き込み中に発生し、続行します。((

0   CoreFoundation                      0x028de02e __exceptionPreprocess + 206
1   libobjc.A.dylib                     0x022bbe7e objc_exception_throw + 44
2   CoreFoundation                      0x02891b6a -[__NSArrayM insertObject:atIndex:] + 314
3   CoreFoundation                      0x02891a20 -[__NSArrayM addObject:] + 64
4   Battles                             0x00221c49 -[MPGameSequencer sequenceInitState] + 809
5   Battles                             0x0021e359 -[MPGameSequencer nextFrame:] + 121
6   Battles                             0x00067324 -[CCTimer update:] + 308
7   Battles                             0x00070444 -[CCScheduler update:] + 772
8   Battles                             0x0009dc81 -[CCDirectorIOS drawScene] + 225
9   Battles                             0x0009ef44 -[CCDirectorDisplayLink mainLoop:] + 52
10  QuartzCore                          0x007c32d2 _ZN2CA7Display11DisplayLink8dispatchEyy + 110
11  QuartzCore                          0x007c375f _ZN2CA7Display16TimerDisplayLink8callbackEP16__CFRunLoopTimerPv + 161
12  CoreFoundation                      0x0289d376 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
13  CoreFoundation                      0x0289ce06 __CFRunLoopDoTimer + 534
14  CoreFoundation                      0x02884a82 __CFRunLoopRun + 1810
15  CoreFoundation                      0x02883f44 CFRunLoopRunSpecific + 276
16  CoreFoundation                      0x02883e1b CFRunLoopRunInMode + 123
17  GraphicsServices                    0x035e57e3 GSEventRunModal + 88
18  GraphicsServices                    0x035e5668 GSEventRun + 104
19  UIKit                               0x00e9165c UIApplicationMain + 1211
20  Battles                             0x000c2bce main + 270
21  Battles                             0x00002a15 start + 53

)。

于 2013-02-09T22:02:49.590 に答える