GSRegisterPurpleNamedPort SIGABRT в UIApplicationMain до того, как делегат приложения получает возможность выполнить любой код
Недавно мы выпустили обновление для одного из наших приложений, и многие пользователи сказали нам, что они больше не могут запускать приложение, потому что оно зависало при запуске.
Мы смогли воссоздать сбой, собрав и запустив сборку предыдущего выпуска на устройстве, а затем собрав и запустив новую сборку поверх него на том же устройстве, но трассировка стека для этого сбоя очень странная:
Thread 0 Crashed:
0 libSystem.B.dylib 0x000791d0 __kill + 8
1 libSystem.B.dylib 0x000791c0 kill + 4
2 libSystem.B.dylib 0x000791b2 raise + 10
3 libSystem.B.dylib 0x0008d6fa abort + 50
4 GraphicsServices 0x00003aa8 GSRegisterPurpleNamedPort + 172
5 GraphicsServices 0x00003d5a GSEventInitialize + 150
6 UIKit 0x00004cd6 UIApplicationMain + 350
7 MyApp 0x0000df5c main (main.m:14)
8 MyApp 0x00002c84 start + 32
Похоже, что происходит сбой в методе UIApplicationMain, который вызывает основной вызов. Но происходит сбой до того, как он достигнет любого из методов нашего делегата приложения. Я установил точки останова во всех методах делегата приложения, и ни один из них не был достигнут.
Кроме того, похоже, что это происходит только для пользователей, которые обновляют приложение. Пользователи, которые загружают его из магазина приложений, пока он не подключен к своим iPhone, не видят проблемы.
Кто-нибудь когда-нибудь сталкивался с такой аварией? Почему эта проблема возникает только для обновлений?
8 ответов
Это под iOS 4.0? Сообщалось, что ошибки такого типа возникают, когда процесс или поток из предыдущей установки этого приложения аварийно завершают работу и каким-то образом еще не были очищены операционной системой или зависли в отладчике.
Вызывает ли эта ошибка исчезновение после перезагрузки iPhone после установки новой версии приложения? Это было бы хорошим признаком того, что что-то застряло / повреждено в ОС из предыдущей установки, а не в самом комплекте приложений.
У меня возникла та же проблема (к счастью, я поймал ее перед отправкой в AppStore). В отличие от этого ответа, проблема все еще возникает на iOS 5.x и 6.x.
Поэтому я вошел в консоль и обнаружил, что несколько сообщений были зарегистрированы до того, как мое приложение упало. Сначала было это сообщение:
com.apple.launchd.peruser.503 [148]: (UIKitApplication: BUNDLE-ID [0x4fb5] [20462]) Следующее задание попыталось захватить службу "BUNDLE-ID-1" из этого задания: UIKitApplication:BUNDLE-ID-1[0xac31]
Следующее сообщение в консоли отображается сразу после этого:
GSRegisterPurpleNamedPort Не удалось зарегистрировать идентификатор BUNDLE на сервере начальной загрузки. Ошибка: неизвестный код ошибки (1100). Как правило, это означает, что другой экземпляр этого процесса уже запущен или завис в отладчике.
Сбой вызван другим почти идентичным процессом, уже запущенным в системе. Похоже, проблема с iOS, а не само приложение. Это должно помочь прояснить ситуацию. Вероятно, лучше всего было бы попросить пользователей выйти из приложения, попробовать перезапустить и снова открыть.
Я также отправил в Apple отчет об ошибке с подробным описанием проблемы.
РЕДАКТИРОВАТЬ: похоже, что это может быть проблема с самим XCode. Apple только что выпустила обновление, которое должно решить проблему (по крайней мере, в симуляторе):
Я получал эту проблему в проекте каждый раз, когда отлаживал ее во второй раз. Только перезагрузка устройства позволила бы мне снова выполнить отладку.
Эта конкретная причина описанной выше трассировки стека была окончательно решена путем переустановки iTunes.
Кажется, что старое приложение было запущено без завершения полностью, некоторые обработчики все еще живы или зарегистрированы ОС, поэтому при запуске новой версии происходит сбой приложения.
Я также столкнулся с такой сложной проблемой, как вы наконец исправили это? Благодарю.
Здесь нет основных данных. Просто обновил текстовый файл в основном комплекте, и внезапно эта "фиолетовая точка" потерпела неудачу. IOS 5.1.1, iPad, приложение opengl с большим количеством жестовых интерфейсов. Я был очень рад найти здесь некоторые подсказки. Сброс исправил это.
Это может быть чисто случайное совпадение, но когда я отлаживаю режим выпуска приложения и, не удаляя его снова, пытаюсь отладить его в режиме отладки, эта проблема, кажется, возникает. перезапуск, однако, делает свое дело.
Кажется, что это произойдет и при обновлении до 10.8.4, я думаю, что это ошибка XCode, я выдам сообщение об ошибке. Если приложение открывается, и я запускаю его из XCode, приложение вылетает, иногда оно перезапускается само по себе, и иногда мне нужно перезапустить его снова.
Если вы используете базовые данные в своем приложении и изменили схему, вы часто будете сталкиваться с этой проблемой. Происходит следующее: старая версия приложения будет иметь старую версию базы данных (предположительно, sqlite), и когда запускается новая версия приложения, она ожидает также и новую версию базы данных. Это вызывает сбой прямо при запуске, как это.
Немедленное исправление - удалить приложение и переустановить его. Мы делаем это в процессе разработки. Но когда вы будете готовы выдвинуть новую версию, вам нужно будет настроить модель сопоставления для переноса базы данных. В документации для разработчиков содержится много информации о переносе данных: