статус: это было замечено совсем недавно, как Mac OS 10.8 и Xcode 4.4.
tl; dr: Это может происходить в двух контекстах: при работе на устройстве и при работе на симуляторе. При работе на устройстве отключение и повторное подключение устройства, кажется, исправляет ситуацию.
Майк Эш предложил
launchctl list|grep UIKitApplication|awk '{print $3}'|xargs launchctl remove
Это не работает все время. На самом деле, он никогда не работал для меня, но в некоторых случаях он работает. Просто не знаю, в каких случаях. Так что стоит попробовать.
В противном случае, единственный известный способ исправить это - перезапустить запуск пользователя. Перезагрузка сделает это, но есть менее радикальный / более быстрый способ. Вам нужно будет создать другого пользователя с правами администратора, но вам нужно будет сделать это только один раз. Когда все заклинивает, выйдите из системы как вы сами, войдите как этот пользователь и убейте 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