Удаление приложения из активных задач приводит к сбою при попытке открыть приложение - PullRequest
5 голосов
/ 05 апреля 2011

Я обнаружил, что могу закрыть приложение iOS, выполнив следующие действия:

  1. Запустить приложение
  2. Выход из приложения (с помощью кнопки «Домой»)
  3. Дважды щелкните кнопку «Домой», чтобы открыть список текущих задач
  4. Принудительно закрыть мое приложение
  5. Закрыть список задач
  6. Запустить мое приложение (сбой)

Пока:

  • Это происходит только на устройстве (3GS под управлением 4.3.1), когда я запускаю отладчик
  • Я не могу сделать это с другими приложениями
  • Это происходит не каждый раз, когда я делаю это
  • Это оставляет iPhone в неоднозначном состоянии с черным экраном - завершение процесса в xcode не толкает меня обратно к трамплину, нажатие кнопки home не имеет никакого эффекта. Я нажимаю кнопку питания, затем кнопку домой и она возвращается к трамплину.

Я делаю это очень быстро, поэтому мне любопытно, может ли это быть ошибкой в ​​моем приложении (и какова может быть эта ошибка) или если трамплин убивает мое приложение так же, как я его перезапускаю

Отладчик сообщает, что мое приложение получило сигнал «SIGKILL», поэтому я склонен полагать, что это просто задержка фактического уничтожения процесса, но я не хочу упускать из виду ошибку, которую я мог сделать.

Учитывая, что я не могу повторить это вне отладчика, это для меня низкий приоритет, но я все же хотел бы лучше понять его, если это возможно, особенно если это указывает на ошибку в моем приложении.

Ответы [ 3 ]

4 голосов
/ 07 апреля 2011

Когда вы убиваете свое приложение, ОС отправляет его SIGKILL. Обычно это убивает ваше приложение, но поскольку к нему подключен отладчик, приложение приостанавливается, чтобы дать вам возможность отладить причину сигнала (вероятно, должно быть исключение для SIGKILL, но это не большая проблема, что нет не один).

При повторном запуске SpringBoard (домашний экран) замечает, что приложение не умерло, и переключается на него. [1] На данный момент, ничего не поделаешь, так как приложение приостановлено. Я думаю SpringBoard обрабатывает неотвечающее приложение, отправляя SIGKILL и ожидая, пока приложение не умрет, но GDB все еще подключен, ваше приложение все еще приостановлено, и ничего не происходит.

В этот момент я обычно нажимаю кнопку остановки XCode, или, если это не работает (потому что XCode 4 является неисправным POC), отключаю телефон.

И если вам интересно, почему SpringBoard не просто игнорирует старый экземпляр вашего приложения и порождает новый: может быть запущен только один экземпляр. Приложения делают это постоянно (например, нет другого экземпляра вашего приложения, обращающегося к его базе данных), и я почти уверен, что есть что-то в пространствах имен портов / начальной загрузки Mach / что-то, что означает, что ваше приложение не запустится, если есть другое копирование выполняется (или если часть системы считает, что ваше приложение все еще работает, потому что не удалось выполнить очистку).


В более старой версии ОС, если ваше приложение потратило много времени, делая что-то при выходе (например, сохраняя), выход и быстрое «перезапуск» приложения переключились бы на приложение «в процессе выхода». , и приложение завершит работу, и начальный экран внезапно появится. Я забыл, в какой версии ОС я видел это, но я думаю, что это исправлено.

2 голосов
/ 06 апреля 2011

Когда вы запускаете приложение через XCode, к процессу присоединяется отладчик (обычно gdb). Что я заметил в Xcode 4, так это то, что gdb не отсоединяется и не завершает работу при выходе из приложения (я имею в виду принудительное завершение его работы).

В iPhone, похоже, хранится некоторая информация о процессе, или он не полностью закрыт, и когда вы перезапускаете свое приложение, gdb обнаруживает изменения и не понимает, что происходит. Возможно, поэтому ваше приложение убито.

Я протестировал его на iPhone 3GS и iPod 4-го поколения и воспроизвел (успешно) ошибку.

0 голосов
/ 06 апреля 2011

Я видел это раньше во время отладки, и я не думаю, что это не ошибка в вашем приложении.

@ Жоффруа ударил ногтем по голове, когда он сказал What I have noticed in Xcode 4 is that gdb isn't detached or quitted when you quit the app (I mean forcing it to terminate).

В Xcode 3 выход из приложения приведет к SIG_ABORT.Кажется, что Xcode 4 обрабатывает вещи немного по-другому.Xcode 4, кажется, игнорирует уничтожение до тех пор, пока вы снова не нажмете значок, когда он ведет себя так, как вы описали.Всегда останавливайте отладчик (нажав на большую кнопку остановки) перед повторным запуском приложения, и вы сможете этого избежать.

Я бы не стал беспокоиться об этом с точки зрения производительности вашего приложения, но выВозможно, вы захотите упомянуть об этом на форумах разработчиков Apple или подать отчет об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...