372 Stimmen

Fehler beim Testen im iOS-Simulator: Konnte sich nicht beim Bootstrap-Server registrieren

Ich testete meine App im Simulator, als sie beim Klicken auf eine Schaltfläche einer UIAlertView abstürzte. Ich beendete das Debugging, nahm einige Änderungen am Code vor und erstellte die App erneut. Wenn ich die Anwendung jetzt ausführe, erhalte ich diesen Fehler in der Konsole

com.myApp.debug konnte nicht beim Bootstrap-Server registriert werden. Fehler: unbekannter Fehlercode. Dies bedeutet in der Regel, dass eine andere Instanz dieses Prozesses bereits läuft oder im Debugger hängt.Program received signal: "SIGABRT".

Ich habe versucht, die Anwendung aus dem Simulator zu entfernen und einen sauberen Build durchzuführen, aber ich erhalte immer noch diesen Fehler, wenn ich versuche, die Anwendung auszuführen.

Was muss ich tun, damit ich die Anwendung wieder auf meinem Simulator ausführen kann?

244voto

smparkes Punkte 13577

Status: Dies ist erst seit Mac OS 10.8 und Xcode 4.4 der Fall.

tl;dr: Dies kann in zwei Kontexten auftreten: bei der Ausführung auf dem Gerät und bei der Ausführung auf dem Simulator. Bei der Ausführung auf dem Gerät scheint das Trennen und erneute Anschließen des Geräts das Problem zu beheben.

Mike Ash schlug vor

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

Das klappt nicht immer. Bei mir hat es noch nie geklappt, aber in einigen Fällen funktioniert es offensichtlich. Ich weiß nur nicht, in welchen Fällen. Es ist also einen Versuch wert.

Andernfalls besteht die einzige bekannte Möglichkeit, das Problem zu beheben, darin, den Benutzer launchd neu zu starten. Ein Neustart wird dies tun, aber es gibt einen weniger drastischen/schnelleren Weg. Sie müssen einen anderen Admin-Benutzer anlegen, aber das müssen Sie nur einmal tun. Wenn sich die Dinge verkeilen, melden Sie sich als Sie selbst ab, melden Sie sich als dieser Benutzer an und beenden Sie den launchd, der zu Ihrem Hauptbenutzer gehört, z. B.,

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

Ersetzen Sie Ihren Hauptbenutzernamen durch user_id . Wenn Sie sich wieder als normaler Benutzer anmelden, kehren Sie zu einem normalen Zustand zurück. Das ist zwar etwas schmerzhaft, aber weniger als ein vollständiger Neustart.

Einzelheiten:

Dieses Problem tritt seit Lion/Xcode 4.2 häufiger auf. (Ich persönlich habe es vor dieser Kombination noch nie gesehen.)

Der Fehler scheint in launchd zu liegen, das den App-Prozess als Kind erbt, wenn der Debugger das Debuggen beendet, ohne ihn zu beenden. Dies wird normalerweise dadurch signalisiert, dass die App ein Zombie wird und in ps den Prozessstatus Z hat.

Das Hauptproblem scheint im Bootstrap-Nameserver zu liegen, der in launchd implementiert ist. Dieser ordnet (soweit ich es verstehe) die Anwendungskennungen den Mach-Ports zu. Wenn der Fehler ausgelöst wird, stirbt die App, wird aber nicht aus der Nameserver-Map des Bootstrap-Servers entfernt, und als Ergebnis weigert sich der Bootstrap-Server, eine weitere Instanz der App unter demselben Namen zu registrieren.

Es wurde gehofft (siehe Kommentare), dass der Zwang, launchd zu wait() für den Zombie würde das Problem lösen, aber das tut es nicht. Es ist nicht der Zombie-Status, der das Kernproblem ist (weshalb einige Zombies gutartig sind), sondern der Bootstrap-Nameserver, und es gibt keine bekannte Möglichkeit, diesen zu löschen, ohne launchd zu töten.

Es sieht so aus, als ob der Fehler durch etwas schlechtes zwischen Xcode, gdb und dem Benutzer launchd ausgelöst wird. Ich habe gerade den Keil wiederholt, indem ich eine App im iphone-Simulator ausgeführt habe, sie in gdb gestoppt habe und dann einen Build und einen Run auf den ipad-Simulator gemacht habe. Es scheint auf den Wechsel der Simulatoren (iOS 4.3/iOS 5, iPad/iPhone) zu reagieren. Es passiert nicht die ganze Zeit, aber ziemlich häufig, wenn ich wechselnden Simulatoren eine Menge.

Wenn Sie launchd beenden, während Sie eingeloggt sind, wird Ihre Sitzung unterbrochen. Wenn Sie sich abmelden und wieder anmelden, wird der Benutzer launchd nicht beendet; OS X behält den bestehenden Prozess bei. Ein Neustart bringt die Sache in Ordnung, aber das ist mühsam. Die obigen Anweisungen sind schneller.

Ich habe einen Fehler bei Apple eingereicht, FWIW. rdar://10330930

162voto

Elliot Kroo Punkte 4313

Versuchen Sie, den Simulator zu beenden und neu zu starten? Im schlimmsten Fall können Sie immer noch einen Neustart versuchen: Meiner Erfahrung nach sollte das Problem dadurch behoben werden.

70voto

jyap Punkte 3516

Ich finde, ich habe dieses Problem mit Lion + Xcode 4.2 begonnen. Ich habe auch das Problem in Xcode 4.3 erlebt.

Ich habe alle Vorschläge ausprobiert, aber keiner von ihnen hat funktioniert, außer einem kompletten Neustart.

So stellen Sie fest, ob Sie einen schnellen Neustart benötigen.

Listen Sie alle Ihre Zombie-Prozesse auf:

ps -el | grep 'Z'

Wenn Ihre Anwendung als Zombie-Prozess aufgeführt wird, müssen Sie Ihren Computer neu starten. In der Fehlermeldung heißt es: "Dies bedeutet in der Regel, dass eine andere Instanz dieses Prozesses bereits ausgeführt wurde oder im Debugger hängt". Nun, Xcode erkennt diesen Zombie-Prozess, den Sie nicht beenden können. Die einzige Möglichkeit, ihn zu beheben, ist ein Neustart des Systems :(

BEARBEITEN, 20120823: Ich kenne mich jetzt etwas besser mit den Zombie-Prozessen aus und wollte diese Antwort aktualisieren. Ein Zombie-Prozess entsteht, wenn ein Elternprozess nicht wait() (warten, bis der Prozess seinen Zustand ändert) für einen beendeten Kindprozess aufruft. Sie können 'kill' nicht direkt auf einen Zombie-Prozess anwenden, aber wenn Sie den Elternprozess beenden, wird der Zombie-Kinderprozess 'geerntet' und aus der Prozesstabelle entfernt.

Ich habe dieses Problem schon lange nicht mehr gesehen und habe daher nicht nachgesehen, was der übergeordnete Prozess in diesem Szenario ist. Die Alternative zum Beenden des übergeordneten Prozesses ist ein Neustart des Systems :)

20voto

n3wscott Punkte 409

Das ist mir gerade passiert: Der Fehler trat nur auf meinem Gerät auf und der Simulator funktionierte einwandfrei. Am Ende musste ich mein Gerät zurücksetzen und der Fehler ging weg.

15voto

sang Punkte 337

Ich habe dieses Problem in letzter Zeit sehr oft. Was könnte dies verhindern? Das Aus- und Einloggen behebt das Problem, aber es ist lästig, dies immer wieder zu tun.

EDITAR:

Ich habe gerade die Ursache gefunden. Ich hatte einen Fehler in der Methode ApplicationWillTerminate. Also, wenn ich klicken Sie auf Stop-Taste auf Xcode-Fenster, app konnte nicht richtig beenden und begann zu hängen.

Überprüfen Sie in der Aktivitätsanzeige, ob Ihre Anwendung auf der Liste steht. erzwingen Sie das Beenden, wenn möglich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X