370 votes

iPhone - étrange erreur lors du test sur simulateur

J'ai été le tester mon application sur le simulateur quand il s'est écrasé en cliquant sur un bouton d'un UIAlertView. J'ai arrêté de débogage, il y, a apporté quelques modifications au code et construit de nouveau l'application. Maintenant, quand je lance l'application, j'obtiens cette erreur dans la console

Impossible d'enregistrer com.myApp.déboguer avec le démarrage du serveur. Erreur: code d'erreur inconnu. Cela signifie généralement qu'une autre instance de ce processus était déjà en cours d'exécution ou suspendu dans le débogueur.Programme du signal reçu: "SIGABRT".

J'ai essayé de la suppression de l'application dans le simulateur, de faire une nouvelle version mais j'ai toujours ce message d'erreur lorsque j'essaye d'exécuter l'application.

Que dois-je faire pour être en mesure d'exécuter l'application sur mon simulateur de nouveau?

242voto

smparkes Points 9849

statut: ce qui a été vu récemment en Mac OS 10.8 et Xcode 4.4.

tl;dr: Cela peut se produire dans deux contextes: lors de l'exécution sur l'appareil et lors de l'exécution sur le simulateur. Lors de l'exécution sur l'appareil, le débrancher et de rebrancher l'appareil semble arranger les choses.

Mike Cendres suggéré

launchctl list|grep UIKitApplication|awk '{print $3}'|xargs launchctl remove

Cela ne fonctionne pas tout le temps. En fait, il n'a jamais travaillé pour moi, mais il fonctionne bien dans certains cas. Juste ne sais pas quels cas. Alors, il vaut la peine d'essayer.

Sinon, le seul moyen de résoudre ce problème est de redémarrer l'utilisateur launchd. Le redémarrage va le faire, mais il est moins radical, plus rapide. Vous aurez besoin de créer un autre utilisateur admin, mais vous ne devez le faire qu'une fois. Quand les choses coin, déconnectez-vous, comme vous-même, connectez-vous en tant qu'utilisateur, et de tuer les launchd qui appartient à votre utilisateur principal, par exemple,

sudo kill -9 `ps aux | egrep 'user_id .*[0-9] /sbin/launchd' | awk '{print $2}'`

en remplaçant votre principal nom d'utilisateur pour user_id. De vous connecter à nouveau que votre utilisateur normal, vous reçoit de retour à un état sain. Un peu douloureux, mais moins qu'un redémarrage.

détails:

Cela a commencé arrive plus souvent avec Lion/Xcode 4.2. (Personnellement, je n'ai jamais vu avant cette combinaison.)

Le bug semble être dans launchd, qui hérite de l'application de processus comme un enfant lorsque le débogueur s'arrête de débogage sans le tuer. C'est généralement signalée par l'application de devenir un zombie, d'avoir un état de processus de Z dans ps.

Le problème principal semble être dans le bootstrap serveur de nom qui est mis en œuvre dans launchd. Ce (dans la mesure où je comprends bien, les cartes, les id d'application de mach ports. Lorsque le bug est déclenchée, l'application meurt mais ne sont pas nettoyés de l'amorçage du serveur nom du serveur de la carte et, par conséquent, le bootstrap serveur refuse de permettre à une autre instance de l'application pour être enregistrés sous le même nom.

Il est à espérer (voir les commentaires) que le fait de forcer launchd pour wait() pour le zombie allait arranger les choses, mais il ne le fait pas. Ce n'est pas le zombie statut qui est le cœur du problème (c'est pourquoi certains zombies sont bénignes), mais le bootstrap nom de serveur et il n'y a pas moyen de désactiver cette avant de tuer launchd.

On dirait que le bug est déclenchée par quelque chose de mauvais entre Xcode, gdb, et l'utilisateur launchd. J'ai juste répété de la cale par l'exécution d'une application dans le simulateur d'iphone, l'avoir arrêté de gdb, et ensuite de faire un build and run à l'ipad simulateur. Il semble être sensible à la commutation des simulateurs (iOS 4.3/iOS 5, l'iPad/iPhone). Ça n'arrive pas tout le temps mais assez souvent quand je suis passer simulateurs beaucoup.

Tuer launchd pendant que vous êtes connecté à vis de votre session. La déconnexion et la reconnexion ne tue pas l'utilisateur launchd; OS X conserve le processus existant autour de. Un redémarrage sera réparer les choses, mais que c'est douloureux. Les instructions ci-dessus sont plus rapides.

J'ai envoyé un bug à Apple, FWIW. rdar://10330930

162voto

Elliot Kroo Points 2199

Essayer d'arrêter et de redémarrer le simulateur? Si "le pire arrive au pire", vous pouvez toujours essayer de redémarrer: dans mon expérience, cela devrait résoudre le problème.

70voto

jyap Points 3131

Je trouve que j'ai commencé à avoir ce problème avec Lion + Xcode 4.2. J'ai aussi eu le problème dans Xcode 4.3.

J'ai essayé toutes les suggestions, mais aucun d'entre eux ont travaillé d'autres qu'un redémarrage.

Voici comment vous devez déterminer si vous avez besoin d'un redémarrage rapide.

Liste de toutes vos Zombie processus:

ps -el | grep 'Z'

Si vous voyez votre application répertoriée comme un Zombie, vous devrez redémarrer votre machine. Le message d'erreur indique "Cela signifie généralement qu'une autre instance de ce processus était déjà en cours d'exécution ou suspendu dans le débogueur". Eh bien, Xcode est la détection de ce Zombie processus de laquelle vous ne pouvez pas les tuer. La seule façon vous pouvez alors fixer c'est avec un redémarrage du système. :(

EDIT, 20120823: j'ai une meilleure connaissance des processus Zombie donc je voulais mettre à jour cette réponse. Un Zombie processus est créé lorsqu'un processus parent ne prend pas l'appel en attente() (attendre pour le processus de changement d'état) sur une terminaison de processus enfant. Vous ne pouvez pas exécuter "tuer" directement sur un Zombie processus, mais si vous tuez le processus parent, le zombie processus enfant d'être "récolté" et retiré de la table de processus.

Je n'ai pas vu ce problème depuis longtemps, donc n'ai pas inspecté pour voir ce que le processus parent est dans ce scénario. L'alternative à tuer le processus parent est de redémarrer votre système. :)

20voto

deoryp Points 379

J'ai juste eu cela m'arrive à moi: j'obtenais l'erreur sur mon appareil et le simulateur a été fonctionne correctement. J'ai fini par avoir à réinitialiser mon appareil et l'erreur a disparu.

15voto

sang Points 304

Je vais avoir ce problème très souvent récemment. Ce qui permettrait d'éviter que cela se produise? Journalisation et résout le problème mais.. c'est gênant de le faire à chaque tellement souvent.

EDIT:

Je viens de trouver la cause. J'ai eu un bug dans ApplicationWillTerminate méthode. Alors, quand je clique sur le bouton d'arrêt sur la fenêtre de Xcode, l'app ne pouvais pas bien terminer et a commencé à se bloquer.

vérifier le Moniteur d'Activité pour voir si votre application est sur la liste. quitter de force si possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X