是啥导致应用程序在后台长时间运行后在恢复时崩溃?

Posted

技术标签:

【中文标题】是啥导致应用程序在后台长时间运行后在恢复时崩溃?【英文标题】:What causes apps to crash on resume after a long time in background?是什么导致应用程序在后台长时间运行后在恢复时崩溃? 【发布时间】:2011-08-09 00:34:22 【问题描述】:

我发现在我的应用程序在后台运行了一段时间后,(半小时 + 可能)它会在恢复时立即崩溃。

崩溃日志显示它是 EXC_BAD_ACCESS,但我不知道如何调试这个,因为我不知道当我的应用程序进入后台时会释放什么(特别是很长一段时间)。 (异常代码0x0000000重复)

是否有关于此的任何文档/任何人都可以提供有关他们过去为解决此问题所做的工作的见解吗?

当我们这样做时,有没有一种方法可以在每次尝试前无需等待数小时来测试它?有什么方法可以模拟我的应用发生的任何事情?

谢谢

更新

我只是仔细阅读了一下,这里有一些关于计时器的内容,我最近在我的应用中添加了一些使用计时器的东西,这可以提供更多信息吗? (见第 12 条)

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x32858a1c __pthread_kill + 8
1   libsystem_c.dylib               0x337013b4 pthread_kill + 52
2   libsystem_c.dylib               0x336f9bf8 abort + 72
3   libstdc++.6.dylib               0x30504a64 __gnu_cxx::__verbose_terminate_handler() + 376
4   libobjc.A.dylib                 0x3068f06c _objc_terminate + 104
5   libstdc++.6.dylib               0x30502e36 __cxxabiv1::__terminate(void (*)()) + 46
6   libstdc++.6.dylib               0x30502e8a std::terminate() + 10
7   libstdc++.6.dylib               0x30502f5a __cxa_throw + 78
8   libobjc.A.dylib                 0x3068dc84 objc_exception_throw + 64
9   MarsCrash                       0x0000be88 0x1000 + 44680
10  MarsCrash                       0x00020646 0x1000 + 128582
11  Foundation                      0x327196ce __NSFireDelayedPerform + 362
12  CoreFoundation                  0x334e7a40 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 8
13  CoreFoundation                  0x334e9ec4 __CFRunLoopDoTimer + 844
14  CoreFoundation                  0x334ea83e __CFRunLoopRun + 1082
15  CoreFoundation                  0x3347aebc CFRunLoopRunSpecific + 224
16  CoreFoundation                  0x3347adc4 CFRunLoopRunInMode + 52
17  GraphicsServices                0x311a5418 GSEventRunModal + 108
18  GraphicsServices                0x311a54c4 GSEventRun + 56
19  UIKit                           0x31b90d62 -[UIApplication _run] + 398
20  UIKit                           0x31b8e800 UIApplicationMain + 664
21  MarsCrash                       0x00002558 0x1000 + 5464
22  MarsCrash                       0x00002500 0x1000 + 5376

【问题讨论】:

【参考方案1】:

这种情况的常见情况是调用由于内存不足警告而释放的对象。 EXEC_BAD_ACCESS — 根据 Apple 的来源 (http://developer.apple.com/library/mac/#qa/qa1367/) 访问过度释放对象您可以通过从设备中获取崩溃日志并将其符号化为产品中的实际代码字符串来找到问题的实际根源。我假设知道类和方法以及代码行号将使您初步了解代码中出了什么问题。请查看以下苹果文章以了解更多详细信息 - http://developer.apple.com/library/ios/#technotes/tn2151/_index.html

对于有关调试的高级主题,以下链接可能也非常有用 — http://developer.apple.com/library/ios/#technotes/tn2239/_index.html 实际上,Apple 提供了许多不同的方法来调试此类问题。

【讨论】:

【参考方案2】:

如果它确实是由内存命中引起的,您可以尝试在模拟器上运行它,该模拟器有一个菜单项,可让您向应用发送模拟内存警告。您的应用程序将尝试在实际内存警告期间执行它所做的所有事情,这可能会帮助您找到错误。另外,查看启用 NSZombies 的运行您可能想查看此页面——我发现它非常有帮助:

http://www.cocoadev.com/index.pl?DebuggingAutorelease

【讨论】:

试过了,把它缩小到很可能不是由内存命中引起的,但还是有帮助的,这简化了事情 我会寻找你自动释放的东西,然后专门释放它,然后自动释放释放死内存。看起来你在主事件循环中崩溃了,这通常发生在自动释放池耗尽时。

以上是关于是啥导致应用程序在后台长时间运行后在恢复时崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

应用程序在后台崩溃,而蓝牙连接长时间丢失

Elixir 长时间运行的后台任务未完成,有时会崩溃

在应用程序被杀死后在应用程序启动时恢复未完成的多部分/表单数据上传任务

web 网页崩溃

长时间运行的后台任务完成后应用程序未挂起

当应用程序进入后台时,在前台执行的长时间运行的任务被挂起