estado: esto se ha visto tan recientemente como Mac OS 10.8 y Xcode 4.4.
tl; dr: Esto puede ocurrir en dos contextos: cuando se ejecuta en el dispositivo y cuando se ejecuta en el simulador. Cuando se ejecuta en el dispositivo, desconectar y volver a conectar el dispositivo parece arreglar las cosas.
Mike Ash sugirió
launchctl list|grep UIKitApplication|awk '{print $3}'|xargs launchctl remove
Esto no funciona todo el tiempo. De hecho, nunca me ha funcionado, pero claramente funciona en algunos casos. Simplemente no sé qué casos. Entonces vale la pena intentarlo.
De lo contrario, la única forma conocida de solucionar esto es reiniciar el usuario launchd. Reiniciar hará eso, pero hay una forma menos drástica / más rápida. Deberá crear otro usuario administrador, pero solo tiene que hacerlo una vez. Cuando las cosas se cumplan, cierre la sesión como usted mismo, inicie sesión como ese usuario y elimine el launchd que pertenece a su usuario principal, por ejemplo,
sudo kill -9 `ps aux | egrep 'user_id .*[0-9] /sbin/launchd' | awk '{print $2}'`
sustituyendo su nombre de usuario principal por user_id
. Iniciando sesión nuevamente cuando tu usuario normal te devuelve a un estado sensato. Un poco doloroso, pero menos que un reinicio completo.
detalles:
Esto ha comenzado a suceder más a menudo con Lion / Xcode 4.2. (Personalmente, nunca lo vi antes de esa combinación).
El error parece estar en launchd, que hereda el proceso de la aplicación como un niño cuando el depurador deja de depurarlo sin matarlo. Por lo general, esto se indica cuando la aplicación se convierte en zombie y tiene un estado de proceso de Z en ps.
El problema principal parece estar en el servidor de nombres de arranque que se implementa en launchd. Esto (en la medida en que lo entiendo) asigna los identificadores de las aplicaciones a los puertos mach. Cuando se activa el error, la aplicación muere pero no se limpia del mapa del servidor de nombres del servidor de arranque y, como resultado, el servidor de arranque se niega a permitir que otra instancia de la aplicación se registre con el mismo nombre.
Se esperaba (ver los comentarios) que forzar el lanzamiento wait()
para el zombie arreglaría las cosas, pero no lo hace. El problema principal no es el estado de zombie (por eso algunos zombis son benignos), sino el servidor de nombres de bootstrap y no hay una forma conocida de despejar este corto de matar a launchd.
Parece que el error se desencadena por algo malo entre Xcode, gdb y el usuario launchd. Acabo de repetir la cuña ejecutando una aplicación en el simulador de iPhone, deteniéndolo dentro de gdb, y luego haciendo una compilación y ejecutando el simulador de ipad. Parece ser sensible a los simuladores de conmutación (iOS 4.3 / iOS 5, iPad / iPhone). No sucede todo el tiempo, pero con bastante frecuencia cuando cambio mucho los simuladores.
Matar lanzado mientras estás conectado arruinará tu sesión. Cerrar sesión y volver a iniciar sesión no mata al usuario launchd; OS X mantiene el proceso existente. Un reinicio arreglará las cosas, pero eso es doloroso. Las instrucciones anteriores son más rápidas.
He enviado un error a Apple, FWIW. rdar: // 10330930