2011-11-08 42 views
5

我的應用程序最近開始顯示奇怪的崩潰,我無法追蹤到源。怎樣尋找會有幫助:)從設備(在iOS 5新iPad)如何在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 s到應用程序來追查這裏發生了什麼。在臨界點的控制檯給我這樣一件事:

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應用程序有類似的問題。顯然,如果你有一個沒有定義自動釋放池的自動釋放對象,系統將立即釋放該對象並打印出這條消息:「... TheClass類的對象0x6872ed0自動釋放,沒有放置池 - 只是泄漏 - 打破objc_autoreleaseNoPool()調試「。在我的代碼中,它甚至在變量賦值之前就釋放了對象,所以我保證在該行後面有不好的內存。要解決,你需要提供一個自動釋放池......你可以用@autoreleasepool換行分配的對象(無論哪一種水平是合適的)代碼{...},如:

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

通過定義自動釋放池與@autoreleasepool,它會保持該數據對象(不嘗試並釋放它),然後您使用該對象。

另一種解決方案是使用不使用autorelease的方法分配正在釋放的對象。我知道NSData,[NSData數據]將返回一個自動釋放對象,而[[NSData alloc] init]不會。有可能與您使用的對象類似。如果你控制分配,這顯然只是一種可能性......如果不是,你很可能會堅持定義一個自動釋放池。

0

這可能只發生在模擬器中。我遇到了類似的問題,我無法修復,但發現它只發生在模擬器中,在所有設備上運行良好。