내 앱이 최근 이상한 충돌을 표시하기 시작하여 소스를 추적 할 수 없습니다. :) 장치 (아이폰 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
메서드를 두 번 호출하면 발생합니다.
이것은 메인이 아닌 스레드에서 자동 풀링 풀에 문제가있는 것 같습니다. 그리고이 앱에서 멀티 스레드를 사용하지 않고 백그라운드 작업을 사용하지 않기 때문에 문제가 될 수도 있습니다. 암호... – kender
이것이 내 코드에서 비 원자 속성을 사용하는 것과 관련이 있는지 궁금합니다. 변수에 대한 액세스가 두 배가되었을 수 있습니까? – kender
콘솔에서 오디오를 시작하는 코드가 두 번 실행 중이지만 동일한 객체를 참조하고있는 것으로 보입니다.이 객체는 해당 객체를 할당 해제 할 때가 지 훌륭한 방법입니다. 오디오를 시작하는 장소 중 하나를 주석으로 처리하십시오 (단 하나의 장소라고 생각하는 경우에도). 그러면 두 번 호출되는지 확인하십시오. 영화 끝에서 트리거되는 이벤트가 두 번 호출되어 결과적으로 오디오가 두 번 시작될 수 있습니다. 부울 플래그를 추가하여 오디오 시작 루틴이 한 번만 실행되도록하십시오. – Tim