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