-1

我正在开发一款 Cocos2d 2.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 虫子之一。不,没有例外。例如

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

前两个被困并且日志语句是明确的,向我吐出日志中的堆栈跟踪。NSLog("21") ...哎呀,忘记了“@”严重崩溃。第四个例子,在使用前错误地释放了一个对象……你知道那是做什么的。我只能建议你:

  • 检查你所有的警告(我在坏的 NSLog 上有一个)
  • 使用仪器分析您的应用程序是否有僵尸。发送到已释放对象的消息也会导致严重崩溃。
  • 尽管存在性能损失,即不要过度使用,但一些策略性放置的 try/catch 块可以提供极大的帮助。通常,我在 Debug 中包装任何“更新”方法,在 Release 中删除 try/catch。
  • 重新检查所有警告:)

祝你好运。

ps:这是我捕获异常时日志的样子。偏移量不是“代码行”,符号化允许这样做。但是,通常情况下,我从跟踪中获得了足够的信息来将其缩小到真正接近。:

-[MPGameSequencer sequenceInitState] : * 编写游戏规范时发生异常 [* -[__NSArrayM insertObject:atIndex:]: object cannot be 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 回答