什么原因导致应用程序在后台很长一段时间后恢复崩溃?

时间:2011-08-09 00:34:23

标签: iphone background-process uiapplicationdelegate

我发现在我的应用程序已经在后台停留了一段时间后,(半小时+也许)它会在恢复时立即崩溃。

崩溃日志显示它是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

2 个答案:

答案 0 :(得分:5)

此类情况的常见情况是调用由于内存不足警告而释放的对象。 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提供了大量不同的方法来调试此类问题。

答案 1 :(得分:1)

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

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