Status: Dies wurde erst in Mac OS 10.8 und Xcode 4.4 festgestellt.
tl; dr: Dies kann in zwei Zusammenhängen auftreten: beim Ausführen auf dem Gerät und beim Ausführen auf dem Simulator. Wenn Sie auf dem Gerät ausgeführt werden, scheint das Trennen und erneute Verbinden des Geräts Probleme zu beheben.
Schlug Mike Ash vor
launchctl list|grep UIKitApplication|awk '{print $3}'|xargs launchctl remove
Das funktioniert nicht immer. Tatsächlich hat es bei mir nie funktioniert, aber in einigen Fällen funktioniert es eindeutig. Weiß nur nicht welche Fälle. Es lohnt sich also, es zu versuchen.
Andernfalls besteht die einzige bekannte Möglichkeit, dies zu beheben, darin, den Benutzer launchd neu zu starten. Ein Neustart wird das tun, aber es gibt einen weniger drastischen / schnelleren Weg. Sie müssen einen anderen Administrator erstellen, dies müssen Sie jedoch 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 Start, der Ihrem Hauptbenutzer gehört, z.
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 erneut anmelden, während Ihr normaler Benutzer Sie wieder in einen normalen Zustand versetzt. Ein bisschen schmerzhaft, aber weniger als ein vollständiger Neustart.
Einzelheiten:
Dies ist bei Lion / Xcode 4.2 immer häufiger vorgekommen. (Ich persönlich habe es vor dieser Kombination noch nie gesehen.)
Der Fehler scheint in launchd zu liegen, der 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 den Prozessstatus Z in ps hat.
Das Hauptproblem scheint auf dem Bootstrap-Nameserver zu liegen, der in launchd implementiert ist. Dies (soweit ich es verstehe) ordnet App-IDs Mach-Ports zu. Wenn der Fehler ausgelöst wird, stirbt die App, wird jedoch nicht aus der Nameserver-Zuordnung des Bootstrap-Servers entfernt. Infolgedessen lehnt der Bootstrap-Server die Registrierung einer anderen Instanz der App unter demselben Namen ab.
Es wurde gehofft (siehe die Kommentare), dass das Erzwingen des Starts wait()
für den Zombie die Dinge reparieren würde, aber das tut es nicht. Es ist nicht der Zombie-Status, der das Kernproblem darstellt (weshalb einige Zombies gutartig sind), sondern der Bootstrap-Nameserver, und es gibt keine bekannte Möglichkeit, dieses Problem zu lösen.
Es sieht so aus, als würde der Fehler durch etwas Schlechtes zwischen Xcode, gdb und dem vom Benutzer gestarteten Benutzer ausgelöst. Ich habe den Keil nur wiederholt, indem ich eine App im iPhone-Simulator ausgeführt habe, sie innerhalb von GDB gestoppt habe und dann einen Build ausgeführt und zum iPad-Simulator ausgeführt habe. Es scheint empfindlich auf Schaltersimulatoren zu reagieren (iOS 4.3 / iOS 5, iPad / iPhone). Es kommt nicht immer vor, aber ziemlich häufig, wenn ich viel zwischen Simulatoren wechsle.
Das Töten von launchd, während Sie angemeldet sind, wird Ihre Sitzung vermasseln. Durch das Abmelden und erneutes Anmelden wird der Benutzer nicht getötet. OS X behält den vorhandenen Prozess bei. Ein Neustart wird die Probleme beheben, aber das ist schmerzhaft. Die obigen Anweisungen sind schneller.
Ich habe einen Fehler bei Apple, FWIW, eingereicht. rdar: // 10330930