Error al realizar pruebas en el simulador de iOS: no se pudo registrar con el servidor de arranque
Estaba probando mi aplicación en el simulador cuando falló al hacer clic en un botón de UIAlertView. Dejé de depurar allí, hice algunos cambios en el código y volví a crear la aplicación. Ahora cuando ejecuto la aplicación me sale este error en la consola
No se pudo registrar com.myApp.debug con el servidor de arranque. Error: código de error desconocido. Generalmente, esto significa que ya se estaba ejecutando otra instancia de este proceso o que está bloqueada en el depurador. El programa recibió la señal: "SIGABRT".
Intenté eliminar la aplicación del simulador y realizar una compilación limpia, pero sigo apareciendo este error cuando intento ejecutar la aplicación.
¿Qué debo hacer para poder volver a ejecutar la aplicación en mi simulador?
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 solucionar 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 este problema es reiniciar el inicio del usuario. Reiniciar hará eso, pero hay una manera menos drástica y más rápida. Necesitará crear otro usuario administrador, pero solo tendrá que hacerlo una vez. Cuando las cosas se estropeen, cierre la sesión como usted mismo, inicie sesión como ese usuario y elimine el archivo lanzado 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
. Iniciar sesión nuevamente como usuario normal lo devolverá a un estado cuerdo. Un poco doloroso, pero menos que un reinicio completo.
detalles:
Esto ha comenzado a suceder con más frecuencia con Lion/Xcode 4.2. (Personalmente, nunca lo había visto antes de esa combinación).
El error parece estar en launchd, que hereda el proceso de la aplicación como hijo cuando el depurador deja de depurarlo sin eliminarlo. Esto generalmente 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 (hasta donde tengo entendido) asigna identificadores de aplicaciones a puertos de máquina. 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 se registre otra instancia de la aplicación con el mismo nombre.
Se esperaba (ver los comentarios) que forzar el lanzamiento wait()
para el zombie solucionaría las cosas, pero no es así. No es el estado de los zombies el problema central (razón por la cual algunos zombies son benignos), sino el servidor de nombres de arranque y no se conoce ninguna forma de solucionar este problema, salvo que se inicie la matanza.
Parece que el error se desencadena por algo malo entre Xcode, gdb y el usuario launchd. Simplemente repetí la cuña ejecutando una aplicación en el simulador de iPhone, deteniéndola dentro de gdb y luego compilando y ejecutando en el simulador de iPad. Parece ser sensible al cambio de simulador (iOS 4.3/iOS 5, iPad/iPhone). No sucede todo el tiempo, pero sí con bastante frecuencia cuando cambio mucho de simulador.
Matar launchd mientras estás conectado arruinará tu sesión. Cerrar sesión y volver a iniciarla no mata al usuario iniciado; OS X mantiene el proceso existente. Un reinicio arreglará las cosas, pero eso es doloroso. Las instrucciones anteriores son más rápidas.
Envié un error a Apple, FWIW. radar://10330930
¿Intenta salir y reiniciar el simulador? Si "lo peor llega a ser peor", siempre puedes intentar reiniciar: en mi experiencia, esto debería solucionarlo.
Descubrí que comencé a tener este problema con Lion + Xcode 4.2. También experimenté el problema en Xcode 4.3.
Probé todas las sugerencias, pero ninguna funcionó, excepto un reinicio completo.
Así es como puede determinar si necesita reiniciar rápidamente.
Enumere todos sus procesos Zombie:
ps -el | grep 'Z'
Si ve su aplicación en la lista como un proceso Zombie, deberá reiniciar su máquina. El mensaje de error indica "Esto generalmente significa que ya se estaba ejecutando otra instancia de este proceso o está bloqueada en el depurador". Bueno, Xcode está detectando este proceso Zombie que no puedes matar. La única forma de solucionarlo es reiniciando el sistema. :(
EDITAR, 20120823: Tengo un mejor conocimiento de los procesos de Zombie, así que quería actualizar esta respuesta. Un proceso Zombie se crea cuando un proceso padre no llama a wait() (espera a que el proceso cambie de estado) en un proceso hijo que termina. No puede ejecutar 'kill' directamente en un proceso Zombie, pero si mata el proceso principal, el proceso hijo zombie será 'cosechado' y eliminado de la tabla de procesos.
No he visto este problema en mucho tiempo, así que no he inspeccionado cuál es el proceso principal en este escenario. La alternativa a eliminar el proceso principal es reiniciar el sistema. :)