2012-10-15 1 views
1

iTunes에서받은 충돌 로그에서 어떤 스레드의 정보를 파헤치는 지 이해하는 데 문제가 있습니다.충돌 한 스레드가 iOS 충돌보고에서 유일하게 중요한 것입니까?

스레드 16이 다운 된 경우입니다. 그래서 [FreePlayMenuScene dealloc] 안에있는 코드를 검사해야합니까, 아니면 그 원인이 다른 스레드에있을 가능성이 있습니까? 예를 들어, Thread 0에는 NSDateFormatter에 대한 언급이 있습니다. 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 

덕분에 많은 :

여기에 코드입니다.

답변

3

음, 절대로 말하지 말자. 항상 한 스레드가 다른 스레드가 예외를 throw하고 충돌을 일으키는 원인이되는 경우가 있습니다. 그러나 그런 상황이 발생하면 보통 타이밍 문제 나 경쟁 조건이 발생하며 충돌이 발생할 때 문제가있는 스레드가 항상 같은 위치에 있었던 것은 드뭅니다. 이러한 상황에서는 나쁜 스레드가 "트랩을 설정"하고 충돌하는 스레드가 잡히게됩니다.

여러 스레드에서 NSDateFormatter를 공유하지 않는 한 귀하의 경우에는 날짜 형식이 아무 관계가 없다고 생각합니다. 그렇지 않으면 스레드로부터 안전하지 않습니다.

예외는 EXC_BAD_ACCESS (잘못된 메모리 주소에 액세스)이므로 [CCScheduler unscheduleAllSelectorsForTarget:]에서 발생합니다. 내 생각에 나쁜 포인터가 Cocos2D 장면 그래프의 어딘가에 숨어 있습니다. 과도하게 출시 된 노드를 추가했을 수 있습니까? 말하기 힘듭니다. 이 경우 문제가있는 다른 스레드는 아니지만이 코드가 잘못되었을 때 문제가 발생하는 것처럼 보입니다.

2

가장 중요한 것은 실제로 추락 한 스레드입니다. 하지만 충돌은 다른 스레드에서 발생하는 시간의 영향을받을 수 있습니다. 그러나 대부분의 경우 충돌 한 스레드 만 관련됩니다. 충돌이 실제로 여러 스레드에서 수행되는 것과 관련이 있거나 여러 스레드에있는 것이므로 반드시 다른 스레드에 대해 걱정할 것입니다.

게시 한 로그에 충돌이 발생했을 때 주 형식화 프로그램이 주 스레드에서 할당 해제되는 중입니다. 아마도 FreePlayMenuScene 문제와 관련된 문제는 아닐 것입니다.