2011-11-08 3 views
5

내 앱이 최근 이상한 충돌을 표시하기 시작하여 소스를 추적 할 수 없습니다. :) 장치 (아이폰 OS 5 아이 패드)에서AQClient 스레드에서 iPad 앱의 이상한 충돌을 추적하는 방법은 무엇입니까?

충돌 로그 도움이 될 것입니다 무엇을 찾아야할지의 어떤 도움 시작 부분에 다음과 같은 것들이다 :

Date/Time:  2011-11-08 19:07:21.044 +0100 
OS Version:  iPhone OS 5.0 (9A334) 
Report Version: 104 

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x406cad3d 
Crashed Thread: 9 

추락 스레드 9는 AQClient 스레드입니다 스택 추적은 다음과 같습니다.

Thread 9 name: AQClient 
Thread 9 Crashed: 
0 libobjc.A.dylib     0x30107fbc objc_msgSend + 16 
1 AVFoundation     0x3420cdc8 _ZL27AudioPlayerAQOutputCallbackPvP16OpaqueAudioQueueP16AudioQueueBuffer + 28 
2 AudioToolbox     0x32a409fe ClientMessageHandler::OutputBufferComplete(unsigned int) + 98 
3 AudioToolbox     0x32a425d6 AQClientCallbackMessageReader::DispatchCallbacks(unsigned char*, unsigned int, void*, unsigned int) + 198 
4 AudioToolbox     0x32a408dc AQCallbackReceiver_CallbackNotificationsAvailable + 364 
5 AudioToolbox     0x329ee4b6 _XCallbackNotificationsAvailable + 54 
6 AudioToolbox     0x329e436c mshMIGPerform + 368 
7 CoreFoundation     0x34fa454c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 32 
8 CoreFoundation     0x34fa44ee __CFRunLoopDoSource1 + 134 
9 CoreFoundation     0x34fa333c __CFRunLoopRun + 1364 
10 CoreFoundation     0x34f264d6 CFRunLoopRunSpecific + 294 
11 CoreFoundation     0x34f2639e CFRunLoopRunInMode + 98 
12 AudioToolbox     0x32a3d29c GenericRunLoopThread::Entry(void*) + 116 
13 AudioToolbox     0x329c5aac CAPThread::Entry(CAPThread*) + 208 
14 libsystem_c.dylib    0x35756c16 _pthread_start + 314 
15 libsystem_c.dylib    0x35756ad0 thread_start + 0 

이것은 AVAudioPlayer 또는 MPMoviePlayer 활동과 관련이있는 것으로 보입니다. 응용 프로그램에서 동영상을 재생 (.m4v 앱의 번들에서)하고, 끝나면 동영상이 보이지 않고 동영상이 재생되고 오디오가 재생되기 시작합니다.

크래시가 발생하는 경우 동일한 오디오가 두 번 재생되는 것을들 수 있습니다. 심지어 의도하지 않은 것입니다. 그런 다음 오디오를 끝낼 때 (AVAudioPlayer를 할당 해제해야 할 때) 응용 프로그램이 충돌합니다.

여기에 무슨 일이 일어나고 있는지 추적하기 위해 앱에 NSLog을 추가했습니다. 중요한 시점에서 콘솔은 나에게 그런 일을했다 :

Nov 8 19:17:19 unknown XXX[1753] <Warning>: Finished movie 
Nov 8 19:17:19 unknown XXX[1753] <Warning>: Finished movie 
Nov 8 19:17:20 unknown XXX[1753] <Warning>: flipping 
Nov 8 19:17:20 unknown XXX[1753] <Warning>: flipping 
Nov 8 19:17:20 unknown XXX[1753] <Warning>: --> dealloc <AVAudioPlayer: 0x6887530> (d2_s3_l3_q9.aif) 
Nov 8 19:17:20 unknown XXX[1753] <Warning>: --> dealloc <AVAudioPlayer: 0x6887530> (d2_s3_l3_q9.aif) 
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x68859f0 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x11ef30 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x1a6720 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x6872400 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 

(...) 

Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x6872ed0 of class __NSCFDictionary autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x10cf80 of class __NSCFNumber autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x6850480 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x10a530 of class __NSCFNumber autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x1d15d0 of class __NSCFNumber autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x6884550 of class TFCrashHandler autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x685ec10 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x6856270 of class __NSCFDictionary autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 
Nov 8 19:17:21 unknown com.apple.networkd[1763] <Notice>: main:212 networkd.1763 built Sep 16 2011 00:02:59 
Nov 8 19:17:25 unknown ReportCrash[1764] <Notice>: Formulating crash report for process XXX[1753] 
Nov 8 19:17:25 unknown com.apple.launchd[1] <Warning>: (UIKitApplication:com.bundle.name[0x2432]) Job appears to have crashed: Segmentation fault: 11 
Nov 8 19:17:25 unknown SpringBoard[15] <Warning>: Application 'XXX' exited abnormally with signal 11: Segmentation fault: 11 
Nov 8 19:17:25 unknown ReportCrash[1764] <Error>: Saved crashreport to /var/mobile/Library/Logs/CrashReporter/XXX_2011-11-08-191724_iKotapad.plist using uid: 0 gid: 0, synthetic_euid: 501 egid: 0 

편집 :

여기서 중요한 부분은, 내 생각, 처음에 두 배로 로그입니다. 충돌이 없으면 한 번만 나타납니다. 그리고 문제는 동일한 객체의 dealloc 메서드를 두 번 호출하면 발생합니다.

답변

2

먼저 autorelease 풀 누출을 처리하고 문제가 있는지 확인하십시오.

+0

이것은 메인이 아닌 스레드에서 자동 풀링 풀에 문제가있는 것 같습니다. 그리고이 앱에서 멀티 스레드를 사용하지 않고 백그라운드 작업을 사용하지 않기 때문에 문제가 될 수도 있습니다. 암호... – kender

+0

이것이 내 코드에서 비 원자 속성을 사용하는 것과 관련이 있는지 궁금합니다. 변수에 대한 액세스가 두 배가되었을 수 있습니까? – kender

+1

콘솔에서 오디오를 시작하는 코드가 두 번 실행 중이지만 동일한 객체를 참조하고있는 것으로 보입니다.이 객체는 해당 객체를 할당 해제 할 때가 지 훌륭한 방법입니다. 오디오를 시작하는 장소 중 하나를 주석으로 처리하십시오 (단 하나의 장소라고 생각하는 경우에도). 그러면 두 번 호출되는지 확인하십시오. 영화 끝에서 트리거되는 이벤트가 두 번 호출되어 결과적으로 오디오가 두 번 시작될 수 있습니다. 부울 플래그를 추가하여 오디오 시작 루틴이 한 번만 실행되도록하십시오. – Tim

1

iOS5 시뮬레이터에서 실행되는 iPhone 앱과 비슷한 문제가있었습니다. 분명히이 설정을 사용하면 autorelease 풀이 정의되지 않은 autoreleased 객체가있는 경우 시스템은 해당 객체를 즉시 해제하고 그 메시지를 출력합니다. "TheClass 클래스의 Object 0x6872ed0은 풀이없는 상태에서 자동으로 풀립니다. - objc_autoreleaseNoPool()을 중단하여 디버그하십시오. " 내 코드에서는 변수 할당 이전에 객체를 릴리스 했으므로 해당 행 다음에 잘못된 메모리가 보장됩니다. 해결하려면, 당신은 예를 들어, {...} 당신이 @autoreleasepool와 (적절한 어떤 수준에서) 그 객체를 할당하는 코드를 래핑 할 수 ... 오토 릴리즈 풀을 제공해야합니다 :

@autoreleasepool { 
    NSData *data = [NSData dataWithBytes:myBytes length:myLength]; 
    //do something with data 
} 

을 정의하여 autorelease 풀을 @autoreleasepool과 함께 사용하면 해당 객체를 사용하는 동안 데이터 객체를 유지하고 (시도하거나 해제하지 않음) 유지합니다.

또 다른 해결책은 자동 해제를 사용하지 않는 방법을 사용하여 해제되는 개체를 할당하는 것입니다. NSData를 사용하면 [NSData data]가 자동 렌더링 된 객체를 반환하지만 [[NSData alloc] init]은 반환하지 않습니다. 당신이 사용하고있는 물건들과 유사 할 가능성이 있습니다. 이것은 할당을 제어하는 ​​경우에만 가능할 가능성이 분명합니다 ... 그렇지 않으면 autorelease 풀을 정의하지 못할 수 있습니다.

0

이것은 시뮬레이터에서만 발생할 수 있습니다. 내가 고칠 수없는 유사한 문제를 경험했지만 시뮬레이터에서만 발생하고 모든 장치에서 정상적으로 작동한다는 것을 알았습니다.

관련 문제