status: isso foi visto recentemente no Mac OS 10.8 e no Xcode 4.4.
tl; dr: Isso pode ocorrer em dois contextos: quando rodando no dispositivo e rodando no simulador. Ao executar no dispositivo, desconectar e reconectar o dispositivo parece consertar as coisas.
Mike Ash sugeriu
launchctl list|grep UIKitApplication|awk '{print $3}'|xargs launchctl remove
Isso não funciona o tempo todo. Na verdade, nunca funcionou para mim, mas claramente funciona em alguns casos. Só não sei quais casos. Então vale a pena tentar.
Caso contrário, a única maneira conhecida de corrigir isso é reiniciar o usuário launchd. A reinicialização fará isso, mas há uma maneira menos drástica / rápida. Você precisará criar outro usuário administrador, mas precisará fazer isso apenas uma vez. Quando as coisas se complicarem, efetue logout como você mesmo, efetue login como usuário e elimine o launchd que pertence ao seu usuário principal, por exemplo,
sudo kill -9 `ps aux | egrep 'user_id .*[0-9] /sbin/launchd' | awk '{print $2}'`
substituindo seu nome de usuário principal user_id
. Efetue login novamente, pois seu usuário normal o levará de volta ao estado normal. Meio doloroso, mas menos do que uma reinicialização completa.
detalhes:
Isso começou a acontecer com mais frequência com o Lion / Xcode 4.2. (Pessoalmente, eu nunca vi isso antes dessa combinação.)
O bug parece estar no launchd, que herda o processo do aplicativo como um filho quando o depurador para de depurá-lo sem matá-lo. Isso geralmente é sinalizado pelo aplicativo se tornar um zumbi, com um status de processo de Z no ps.
O problema principal parece estar no servidor de nome de autoinicialização implementado no launchd. Isso (na medida em que eu entendo) mapeia os IDs de aplicativos para as portas mach. Quando o bug é acionado, o aplicativo morre, mas não é limpo do mapa do servidor de nomes do servidor de inicialização e, como resultado, o servidor de inicialização se recusa a permitir que outra instância do aplicativo seja registrada com o mesmo nome.
Esperava-se (ver os comentários) que forçar o launchd wait()
para o zumbi consertasse as coisas, mas não o faz. Não é o status de zumbi que é o principal problema (e é por isso que alguns zumbis são benignos), mas o servidor de nome de autoinicialização e não há maneira conhecida de resolver esse problema.
Parece que o bug foi acionado por algo ruim entre o Xcode, gdb e o usuário launchd. Acabei de repetir a cunha executando um aplicativo no simulador do iphone, interrompendo-o no gdb e fazendo uma compilação e execução no simulador de ipad. Parece ser sensível aos simuladores de comutação (iOS 4.3 / iOS 5, iPad / iPhone). Isso não acontece o tempo todo, mas com bastante frequência quando eu mudo muito de simulador.
Matar launchd enquanto você estiver logado estragará sua sessão. Efetuar logout e logon novamente não mata o usuário launchd; OS X mantém o processo existente por perto. Uma reinicialização corrigirá as coisas, mas isso é doloroso. As instruções acima são mais rápidas.
Enviei um bug para a Apple, FWIW. rdar: // 10330930