1

在从 iTunes 获得的崩溃日志中,我无法理解要挖掘的线程信息。

它说线程 16 崩溃了。那么,我是否必须检查 [FreePlayMenuScene dealloc] 中的代码,还是有可能原因位于另一个线程中?例如,在线程 0 中提到了 NSDateFormatter,我不明白这是否相关。

作为一个通用问题来问这个问题,在阅读崩溃日志时,我们应该只检查崩溃的线程还是其他线程中也可能有有用的信息?不幸的是,我在这里或网上的任何地方都找不到类似的问题。

这是代码:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000
Crashed Thread:  16

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0:
0   libicucore.A.dylib              0x3333feac udat_close + 0
1   CoreFoundation                  0x37cd60d0 __CFDateFormatterDeallocate + 12
2   CoreFoundation                  0x37c513ce CFRelease + 290
3   Foundation                      0x354795ea -[NSDateFormatter _clearFormatter] + 22
4   Foundation                      0x354a4b44 -[NSDateFormatter dealloc] + 52
5   libobjc.A.dylib                 0x34b95484
6   CoreFoundation                  0x37c5343c _CFAutoreleasePoolPop + 12
7   Foundation                      0x35500978 __NSThreadPerformPerform + 600
8   CoreFoundation                  0x37ce5680         9   CoreFoundation                   0x37ce4ee4 __CFRunLoopDoSources0 + 208
10  CoreFoundation                  0x37ce3cb2 __CFRunLoopRun + 642
11  CoreFoundation                  0x37c56eb8 CFRunLoopRunSpecific + 352
12  CoreFoundation                  0x37c56d44 CFRunLoopRunInMode + 100
13  GraphicsServices                0x345592e6 GSEventRunModal + 70
14  UIKit                           0x345c32fc UIApplicationMain + 1116
15  AClockworkBrain                 0x0000365a main (main.m:13)
16  AClockworkBrain                 0x0000361c start + 36

...
...

Thread 16 Crashed:
0   AClockworkBrain                 0x001d7cd2 -[CCScheduler unscheduleAllSelectorsForTarget:] + 126
1   AClockworkBrain                 0x001ca8f8 -[CCNode unscheduleAllSelectors] + 48
2   AClockworkBrain                 0x001c9526 -[CCNode cleanup] + 38
3   AClockworkBrain                 0x001f1016 -[CCArray makeObjectsPerformSelector:] + 54
4   AClockworkBrain                 0x001c9550 -[CCNode cleanup] + 80
5   AClockworkBrain                 0x001f1016 -[CCArray makeObjectsPerformSelector:] + 54
6   AClockworkBrain                 0x001c9550 -[CCNode cleanup] + 80
7   AClockworkBrain                 0x001c9cf4 -[CCNode removeAllChildrenWithCleanup:] + 156
8   AClockworkBrain                 0x00078ecc -[FreePlayMenuScene dealloc] (FreePlayMenuScene.m:776)
9   Foundation                      0x35500e4c __NSFinalizeThreadData + 1004
10  CoreFoundation                  0x37ce0f7e __CFTSDFinalize + 62
11  libsystem_c.dylib               0x37ab9128 _pthread_tsd_cleanup + 172
12  libsystem_c.dylib               0x37ab8dfe _pthread_exit + 114
13  libsystem_c.dylib               0x37ad2160 pthread_exit + 24
14  Foundation                      0x35489226 +[NSThread exit] + 6
15  Foundation                      0x35500696 __NSThread__main__ + 998
16  libsystem_c.dylib               0x37ac630e _pthread_start + 306
17  libsystem_c.dylib               0x37ac61d4 thread_start + 4

非常感谢。

4

2 回答 2

3

好吧,永远不要说永远:总会有这样一种情况,一个线程执行某些操作会导致另一个线程抛出异常并崩溃。但是,当这种情况发生时,您通常会遇到某种时间问题或竞争条件,并且当崩溃发生时,麻烦制造线程总是在同一个地方是很少见的。在这些情况下,坏线程“设置了一个陷阱”,然后崩溃的线程被困在其中。

在您的情况下,我认为日期格式与它没有任何关系,除非您在多个线程上共享 NSDateFormatter (不要,它不是线程安全的)。

由于异常是 EXC_BAD_ACCESS (访问无效的内存地址)并且它发生在 中[CCScheduler unscheduleAllSelectorsForTarget:],我的猜测是一个错误的指针潜伏在您的 Cocos2D 场景图中的某个地方。也许您添加了一个过度发布的节点?很难说。在这种情况下,不一定是另一个线程有问题,但看起来问题是由其他一些代码设置的,当这段代码偶然发现它时会导致问题。

于 2012-10-15T19:53:20.207 回答
2

最重要的是实际崩溃的线程。但请记住,崩溃可能会受到当时其他线程中发生的事情的影响。但在大多数情况下,只有崩溃的线程是相关的。如果崩溃实际上与跨多个线程完成的事情有关,或者事情在多个线程中并且不应该是,我会担心其他线程。

在您发布的日志中,恰好在崩溃时,日期格式化程序正在主线程上被释放。可能与您的 FreePlayMenuScene 问题完全无关。

于 2012-10-15T19:53:30.640 回答