Что приводит к аварийному завершению работы приложений при возобновлении работы в фоновом режиме? - PullRequest
3 голосов
/ 09 августа 2011

Я обнаружил, что после того, как мое приложение какое-то время находилось в фоновом режиме, (через полчаса + возможно) оно сразу падает при возобновлении работы.

Журнал сбоев показывает, что это 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 ]

5 голосов
/ 09 августа 2011

Распространенным случаем для таких ситуаций является вызов объекта, который был освобожден из-за предупреждений о нехватке памяти.EXEC_BAD_ACCESS - доступ к объекту перевыпуска в соответствии с источником Apple (http://developer.apple.com/library/mac/#qa/qa1367/)). Вы можете найти фактический источник проблемы, взяв журналы сбоев с вашего устройства и обозначив их в виде реальных строк кода в вашем продукте. Я полагаю,что знание класса, метода и номера строки кода даст вам предварительное представление о том, что не так в вашем коде. Пожалуйста, просмотрите следующую статью Apple, чтобы понять более подробную информацию - http://developer.apple.com/library/ios/#technotes/tn2151/_index.html

.ссылка также может быть очень полезной - http://developer.apple.com/library/ios/#technotes/tn2239/_index.html На самом деле Apple предоставляет массу разных способов отладки такого рода проблемы.

1 голос
/ 09 августа 2011

Если это действительно вызвано попаданием памяти, вы можете попробовать запустить его на симуляторе, у которого есть пункт меню, который позволяет отправить вашему приложению предупреждение о симуляции памяти.Ваше приложение будет пытаться делать все то, что оно делает во время реального предупреждения о памяти, и это может помочь вам найти вашу ошибку.Кроме того, посмотрите, как работает NSZombies. Вы можете зайти на эту страницу - я считаю ее очень полезной:

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

...