应用程序未能及时恢复

我遇到了一个“无法及时恢复”的崩溃(我认为这是一个非常具体的情况):只有当从后台恢复,并且只有在很短的时间内去后台(一个最多几秒)。

这似乎是相关的崩溃日志:

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 

我已经尝试debugging这个,但它似乎并没有发生连接到debugging器(和所有相关的信息,我已经发现,build议wacthdog被禁用时,连接到debugging器),所以我然后尝试logging进程尝试并遵循所发生的事情。

我已经将日志logging添加到所有AppDelegate相关方法( applicationWillResignActiveapplicationDidEnterBackgroundapplicationWillEnterForegroundapplicationDidBecomeActive甚至applicationWillTerminate ),但是从后台返回时仅在进入后台时才得到日志。 我知道有些进程可以以一种方式进行调度,即使应用程序在后台运行一段时间,也可以恢复,但是我自己并不执行任何这样的进程。 也许Facebook的SDK做这样的事情,但我也找不到任何的参考,而崩溃日志没有提供任何迹象。

我在这里有点不知所措,希望任何推动甚至推动正确的方向。

是的,这是看门狗相关的。

是否有可能你的写作过程需要在主线程上花费太多的时间,并阻止那个? 这可以解释为什么当从后台返回时没有显示日志数据,而这只发生在后台很快恢复之后。

我会build议做以下几点:

  1. 在进入后台而不是在主线程中写入数据,但通过以下方式使用后台任务:

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

  2. 如果应用程序在该后台任务仍在运行的情况下继续运行,则相应地采取行动,例如在写完之前不要读取,或者如果仍在写入,则不要再次写入。 所以你需要知道你自己的状态

最大的规则:永远不要用任何东西阻塞主线程可能需要超过一秒的时间。 全部移入后台线程或在这种情况下进入后台任务。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_main_queue(), ^{ // run that crashing thread here. }); });