Статус: это было замечено совсем недавно, как Mac OS 10.8 и Xcode 4.4.
tl; dr: это может происходить в двух контекстах: при работе на устройстве и при работе на симуляторе. При работе на устройстве отключение и повторное подключение устройства, кажется, исправляет ситуацию.
Майк Эш предложил
launchctl list|grep UIKitApplication|awk '{print $3}'|xargs launchctl remove
Это не работает все время. На самом деле, он никогда не работал для меня, но в некоторых случаях он работает. Просто не знаю, в каких случаях. Так что стоит попробовать.
В противном случае единственный известный способ исправить это - перезапустить пользователя launchd. Перезагрузка сделает это, но есть менее радикальный / более быстрый способ. Вам нужно будет создать другого пользователя-администратора, но вам нужно будет сделать это только один раз. Когда все заклинивает, выйдите из системы как вы сами, войдите в систему как этот пользователь и убейте launchd, принадлежащий вашему основному пользователю, например,
sudo kill -9 `ps aux | egrep 'user_id .*[0-9] /sbin/launchd' | awk '{print $2}'`
заменяя ваше основное имя пользователя на user_id
. Войдите снова, поскольку ваш обычный пользователь возвращает вас в нормальное состояние. Вроде больно, но меньше, чем полная перезагрузка.
подробности:
Это стало происходить чаще с Lion / Xcode 4.2. (Лично я никогда не видел это до этой комбинации.)
Ошибка, по-видимому, в launchd, который наследует процесс приложения как дочерний, когда отладчик прекращает отлаживать его, не убивая его. Обычно это сигнализируется тем, что приложение становится зомби и имеет статус процесса Z в пс.
Основная проблема заключается в сервере имен начальной загрузки, который реализован в launchd. Это (насколько я понимаю) отображает идентификаторы приложений на порты Mach. При возникновении ошибки приложение умирает, но не очищается от карты сервера имен сервера начальной загрузки, и в результате сервер начальной загрузки отказывается разрешить регистрировать другой экземпляр приложения под тем же именем.
Была надежда (см. Комментарии), что принуждение к запуску wait()
зомби исправит ситуацию, но это не так. Основная проблема не в статусе зомби (именно поэтому некоторые зомби доброкачественны), а в сервере имен начальной загрузки, и нет никакого известного способа избавиться от этого, если не убить launchd.
Похоже, ошибка вызвана чем-то плохим между Xcode, gdb и пользователем launchd. Я просто повторил клин, запустив приложение в симуляторе iphone, остановив его в gdb, а затем выполнив сборку и запустив симулятор ipad. Кажется, он чувствителен к переключению симуляторов (iOS 4.3 / iOS 5, iPad / iPhone). Это происходит не всегда, а довольно часто, когда я часто переключаю симуляторы.
Убийство launchd во время входа в систему испортит ваш сеанс. Выход из системы и повторный вход в систему не убивают пользователя launchd; OS X поддерживает существующий процесс. Перезагрузка все исправит, но это больно. Инструкции выше быстрее.
Я отправил сообщение об ошибке в Apple, FWIW. rdar: // 10330930