2013-01-16 99 views
3

我遇到了一個非常具體的情況下「無法及時恢復」崩潰(我認爲它是看門狗相關的):只有在從後臺恢復時,並且只有在非常短的時間內去背景之​​後的時間量(最多幾秒鐘)。應用程序未能及時恢復

這似乎是相關的崩潰日誌:

Incident Identifier: E30F2238-5B15-49A1-BCBC-386791AC93FA 
CrashReporter Key: 84f4fb61c9e5c597750146695fffdc55f7273fb7 
Hardware Model:  iPod4,1 
Process:   XXXXXXX 
Path:   /var/mobile/Applications/DE774CCE-D452-418D-A862-4562A0E5F1D0/XXXXXXX.app/XXXXXXX 
Identifier:  XXXXXXX 
Version:   ??? (???) 
Code Type:  ARM (Native) 
Parent Process: launchd [1] 

Date/Time:  2013-01-14 13:15:41.955 +0200 
OS Version:  iOS 6.0 (10A403) 
Report Version: 104 

Exception Type: 00000020 
Exception Codes: 0x000000008badf00d 
Highlighted Thread: 0 

Application Specific Information: 
XXXXXXX failed to resume in time 

Elapsed total CPU time (seconds): 9.140 (user 9.140, system 0.000), 91% CPU 
Elapsed application CPU time (seconds): 7.806, 78% CPU 

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0: 
0 libsystem_kernel.dylib   0x336fa7cc fsync + 8 
1 Foundation      0x3a444974 _NSWriteBytesToFileWithExtendedAttributes + 668 
2 Foundation      0x3a4446ce _NSWriteBytesToFile + 22 
3 Foundation      0x3a4446ac -[NSData(NSData) writeToFile:atomically:] + 80 
4 XXXXXX       0x001777ee 0xe3000 + 608238 
5 CoreFoundation     0x38361034 _CFXNotificationPost + 1424 
6 Foundation      0x3a437d8c -[NSNotificationCenter postNotificationName:object:userInfo:] + 68 
7 Foundation      0x3a43b84e -[NSNotificationCenter postNotificationName:object:] + 26 
8 XXXXXX       0x000e6616 0xe3000 + 13846 
9 UIKit       0x37e050e4 -[UIApplication _handleApplicationSuspend:eventInfo:] + 780 
10 UIKit       0x37d7b1ea -[UIApplication handleEvent:withNewEvent:] + 2454 
11 UIKit       0x37d7a6d0 -[UIApplication sendEvent:] + 68 
12 UIKit       0x37d7a11e _UIApplicationHandleEvent + 6150 
13 GraphicsServices    0x3600d5a0 _PurpleEventCallback + 588 
14 GraphicsServices    0x3600d1ce PurpleEventCallback + 30 
15 CoreFoundation     0x383e5170 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 32 
16 CoreFoundation     0x383e5112 __CFRunLoopDoSource1 + 134 
17 CoreFoundation     0x383e3f94 __CFRunLoopRun + 1380 
18 CoreFoundation     0x38356eb8 CFRunLoopRunSpecific + 352 
19 CoreFoundation     0x38356d44 CFRunLoopRunInMode + 100 
20 GraphicsServices    0x3600c2e6 GSEventRunModal + 70 
21 UIKit       0x37dce2fc UIApplicationMain + 1116 
22 XXXXXXX       0x000e5cd0 0xe3000 + 11472 
23 XXXXXXX       0x000e5c6c 0xe3000 + 11372 

我試圖調試這一點,但它似乎並沒有當連接到一個調試器(以及所有相關信息,我發現上發生該問題表明wacthdog在連接到調試器時被禁用),所以我嘗試記錄該進程以嘗試並遵循所發生的事情。

我添加記錄到所有AppDelegate相關方法(applicationWillResignActiveapplicationDidEnterBackgroundapplicationWillEnterForegroundapplicationDidBecomeActive甚至applicationWillTerminate),但是從後臺返回時,將背景只有當沒有得到日誌。我知道某些進程可以以一種方式進行調度,即使應用程序在後臺運行指定的時間也可以恢復,但我不會自行執行任何此類進程。也許Facebook的SDK做這樣的事情,但我也找不到任何的參考,而崩潰日誌沒有提供任何跡象。

我在這裏有點不知所措,並希望任何推動,甚至在正確的方向推動。

+0

你可能阻塞主線程過長,iOS的終止應用程序。你必須將長程序推到任何後臺線程,這可能會有所幫助。 – holex

回答

7

是的,這是看門狗相關的。

您的寫作過程是否可能在主線程上花費太多時間並阻止該線程?這可以解釋爲什麼從後臺返回時沒有顯示日誌數據,而且這種情況只發生在轉到後臺後很快恢復。

我建議做以下幾點:

  1. 編寫你的數據進入後臺時,不是在主線程, 而是通過使用一個後臺任務:

    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{...

  2. 如果應用程序在該後臺任務仍在運行時恢復,相應地執行 ,例如在完成寫入之前不要閱讀,或者如果它仍在寫入,則不要再寫入 。所以你需要知道你的 自己的狀態

最大的規則:永遠不要阻塞任何東西的主線程可能需要超過幾分之一秒。將這些全部移到後臺線程或在這種情況下進入後臺任務。其中螺紋您應用程式

+0

謝謝!這似乎確實讓我走向了正確的方向......我想在我覺得這個問題確實已經解決之前再運行一些測試,所以我還沒有接受你的答案。 –

+0

@Kerni我正面臨一個類似的問題。我遵循了你的答案中提到的第一點,但我不明白你的意思是第二點是什麼。我該如何檢查後臺任務是否已完成或仍在進行中。您可以請幫助我更多info.Thanks提前 – Dinakar

+0

只需創建一個布爾iVar,當你存儲後臺任務開始和結束時。所以如果伊娃說它仍在運行,你就不會再開始。 – Kerni

0

發現崩潰把那個線程 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_main_queue(), ^{ // run that crashing thread here. }); });