stato: questo è stato visto di recente come Mac OS 10.8 e Xcode 4.4.
tl; dr: ciò può verificarsi in due contesti: quando si esegue sul dispositivo e quando si esegue sul simulatore. Durante l'esecuzione sul dispositivo, scollegare e ricollegare il dispositivo sembra risolvere le cose.
Suggerì Mike Ash
launchctl list|grep UIKitApplication|awk '{print $3}'|xargs launchctl remove
Questo non funziona sempre. In effetti, non ha mai funzionato per me, ma funziona chiaramente in alcuni casi. Non so quali casi. Quindi vale la pena provare.
Altrimenti, l'unico modo noto per risolvere questo problema è riavviare l'utente avviato. Il riavvio lo farà, ma c'è un modo meno drastico / più veloce. Devi creare un altro utente amministratore, ma devi farlo una sola volta. Quando le cose si incastrano, disconnettiti come te stesso, accedi come quell'utente ed elimina il launchd che appartiene all'utente principale, ad es.
sudo kill -9 `ps aux | egrep 'user_id .*[0-9] /sbin/launchd' | awk '{print $2}'`
sostituendo il nome utente principale per user_id
. Effettuare nuovamente l'accesso quando l'utente normale ti riporta in uno stato sano. Un po 'doloroso, ma meno di un riavvio completo.
dettagli:
Ciò ha iniziato a verificarsi più spesso con Lion / Xcode 4.2. (Personalmente, non l'ho mai visto prima di quella combinazione.)
Il bug sembra essere in launchd, che eredita il processo dell'app come figlio quando il debugger interrompe il debug senza ucciderlo. Questo di solito viene segnalato dall'app che diventa uno zombi, con uno stato del processo di Z in ps.
Il problema principale sembra essere nel server dei nomi bootstrap implementato in launchd. Questo (nella misura in cui lo capisco) associa gli ID app alle porte mach. Quando il bug viene attivato, l'app muore ma non viene eliminata dalla mappa del server dei nomi del server bootstrap e, di conseguenza, il server bootstrap rifiuta di consentire a un'altra istanza dell'app di essere registrata con lo stesso nome.
Si sperava (vedi i commenti) che forzare il lancio su wait()
per lo zombi avrebbe risolto le cose, ma non è così. Non è lo stato degli zombi che è il problema principale (motivo per cui alcuni zombi sono benigni), ma il server dei nomi bootstrap e non esiste un modo noto per eliminare questo corto di uccidere launchd.
Sembra che il bug sia innescato da qualcosa di brutto tra Xcode, gdb e l'utente avviato. Ho appena ripetuto il cuneo eseguendo un'app nel simulatore di iPhone, facendola arrestare all'interno di gdb, quindi facendo una build ed eseguendo il simulatore ipad. Sembra essere sensibile ai simulatori di commutazione (iOS 4.3 / iOS 5, iPad / iPhone). Non succede sempre, ma abbastanza frequentemente quando cambio molto i simulatori.
Uccidere launchd mentre sei connesso rovinerà la tua sessione. Disconnettersi e riconnettersi non uccide l'utente avviato; OS X mantiene attivo il processo esistente. Un riavvio risolverà le cose, ma è doloroso. Le istruzioni sopra sono più veloci.
Ho inviato un bug ad Apple, FWIW. rdar: // 10330930