status: było to widoczne ostatnio w systemie Mac OS 10.8 i Xcode 4.4.
tl; dr: Może się to zdarzyć w dwóch kontekstach: podczas uruchamiania na urządzeniu i podczas uruchamiania na symulatorze. Podczas pracy na urządzeniu odłączanie i ponowne podłączanie urządzenia wydaje się naprawiać problemy.
Mike Ash zasugerował
launchctl list|grep UIKitApplication|awk '{print $3}'|xargs launchctl remove
To nie działa cały czas. W rzeczywistości dla mnie to nigdy nie działało, ale w niektórych przypadkach wyraźnie działa. Po prostu nie wiem, które przypadki. Warto więc spróbować.
W przeciwnym razie jedynym znanym sposobem rozwiązania tego problemu jest ponowne uruchomienie uruchomionego użytkownika. Ponowne uruchomienie spowoduje to, ale istnieje mniej drastyczny / szybszy sposób. Musisz utworzyć innego użytkownika administracyjnego, ale musisz to zrobić tylko raz. Kiedy coś się zaklinuje, wyloguj się jako ty, zaloguj się jako ten użytkownik i zabij uruchomionego, który należy do twojego głównego użytkownika, np.
sudo kill -9 `ps aux | egrep 'user_id .*[0-9] /sbin/launchd' | awk '{print $2}'`
zastępując swoją główną nazwę użytkownika user_id
. Zalogowanie się ponownie, gdy normalny użytkownik powróci do normalnego stanu. Trochę bolesne, ale mniej niż pełne ponowne uruchomienie.
Detale:
To zaczęło się częściej zdarzać w Lion / Xcode 4.2. (Osobiście nigdy nie widziałem tego przed tą kombinacją).
Błąd wydaje się być uruchomiony, co dziedziczy proces aplikacji jako dziecko, gdy debugger przestaje debugować go bez zabijania. Zazwyczaj jest to sygnalizowane przez aplikację, która staje się zombie, mając status procesu Z w ps.
Wydaje się, że głównym problemem jest serwer nazw bootstrap, który jest zaimplementowany podczas uruchamiania. To (o ile rozumiem) mapuje identyfikatory aplikacji na porty mach. Po uruchomieniu błędu aplikacja umiera, ale nie jest usuwana z mapy serwera nazw serwera bootstrap, w wyniku czego serwer bootstrap odmawia rejestracji innej instancji aplikacji pod tą samą nazwą.
Spodziewano się (patrz komentarze), że wymuszono uruchomienie wait()
dla zombie naprawi rzeczy, ale tak nie jest. To nie status zombie jest głównym problemem (dlatego niektóre zombie są łagodne), ale serwer nazw bootstrap i nie ma znanego sposobu na usunięcie tego braku zabijania.
Wygląda na to, że błąd został wywołany przez coś złego między Xcode, gdb i uruchomionym użytkownikiem. Właśnie powtórzyłem klin, uruchamiając aplikację w symulatorze iPhone'a, zatrzymując ją w gdb, a następnie wykonując kompilację i uruchamiając na symulatorze iPada. Wydaje się być wrażliwy na przełączanie symulatorów (iOS 4.3 / iOS 5, iPad / iPhone). Nie zdarza się to cały czas, ale dość często, kiedy często zmieniam symulatory.
Zabijanie uruchomione, gdy jesteś zalogowany, spieszy twoją sesję. Wylogowanie i ponowne zalogowanie nie zabija uruchomionego użytkownika; OS X utrzymuje obecny proces. Ponowne uruchomienie naprawi rzeczy, ale to bolesne. Powyższe instrukcje są szybsze.
Przesłałem błąd do Apple, FWIW. rdar: // 10330930