2011-04-05 12 views
5

trovo che posso andare in crash il mio app iOS eseguendo la seguente:Rimozione app dalla task attivi si traduce in crash quando si tenta di riaprire l'applicazione

  1. Avviare l'applicazione
  2. Uscire dalla app (utilizzando il tasto home)
  3. doppio clic sul tasto Home per visualizzare l'elenco delle attività in esecuzione
  4. Forza mia app per chiudere
  5. chiudere l'elenco delle attività
  6. Inizia la mia app (arresto)

Finora:

  • Questo accade solo sul dispositivo (3GS in esecuzione 4.3.1) quando sono in esecuzione il debugger
  • non posso farlo accadere con altre applicazioni
  • Non succede ogni volta che lo faccio
  • Lascia l'iPhone in uno stato ambiguo con uno schermo nero - terminare il processo in xcode non mi spinge in trampolino, premendo il tasto home non ha alcun effetto. Premo il pulsante di accensione, poi il tasto Home e ritorna al trampolino.

lo sto facendo molto in fretta, però, quindi sono curioso di sapere se è probabile che sia un bug nella mia app (e ciò che il bug potrebbe essere) o se trampolino sta uccidendo la mia app come io' riavvialo?

Il debugger segnala che la mia app ha ricevuto il segnale "SIGKILL", quindi sono propenso a credere che sia solo un ritardo nell'uccidere il processo, ma non voglio trascurare un errore che avrei potuto commettere.

Dato che non riesco a ripeterlo al di fuori del debugger, per me è una priorità bassa, ma mi piacerebbe comunque capirlo meglio se possibile, soprattutto se fa riferimento a un errore nella mia app.

risposta

4

Quando si uccide l'app, il sistema operativo invia SIGKILL. Normalmente questo uccide la tua app, ma dato che c'è un debugger collegato, l'app è sospesa per darti la possibilità di eseguire il debug della causa del segnale (probabilmente ci dovrebbe essere un'eccezione per SIGKILL, ma non è un grosso problema che non ci sia uno).

Quando lo si avvia nuovamente, SpringBoard (la schermata iniziale) rileva che l'app non è morta e passa ad essa. [1] A questo punto, non c'è nulla che possa fare da quando l'app è sospesa. I think SpringBoard gestisce un'app non responsiva inviandola SIGKILL e aspettando che l'app morisse, ma GDB è ancora collegato, l'app è ancora sospesa e non succede niente.

A questo punto di solito faccio clic sul pulsante di arresto di Xcode, o se ciò non funziona (perché Xcode 4 è un POC bacato), scollegare il telefono.

E se ti stai chiedendo perché SpringBoard non ignori semplicemente la vecchia istanza della tua app e ne crei una nuova: Ci può essere solo un'istanza in esecuzione. Le app lo fanno sempre (per esempio non c'è un'altra istanza della tua app che acceda al suo database), e sono abbastanza sicuro che ci sia qualcosa riguardo le porte Mach/namespace di bootstrap/qualcosa che significa che la tua app non si avvierà se ce n'è un'altra copia in esecuzione (o se una parte del sistema pensa che la tua app sia ancora in esecuzione perché qualcosa non è riuscito a eseguire la pulizia).


Su una versione precedente del sistema operativo, se la vostra applicazione ha speso un sacco di tempo a fare qualcosa in uscita (ad esempio il risparmio), uscendo e rapidamente "ri-lancio" l'applicazione potrebbe passare alla in-the-processo- di uscire dalla app, e l'app avrebbe finito di uscire, e la schermata iniziale sarebbe apparso all'improvviso. Ho dimenticato quale versione del sistema operativo ho visto questo, ma penso che sia stato risolto.

2

Quando si avvia l'applicazione tramite Xcode, il debugger (in genere gdb) viene allegato al processo. Quello che ho notato in Xcode 4 è che gdb non è scollegato o abbandonato quando esci dall'app (voglio dire costringendolo a terminare).

L'iPhone sembra mantenere alcune informazioni sul processo, o non è completamente chiuso e quando si riavvia l'app, gdb rileva le modifiche e non capisce cosa sta succedendo. Questo è forse il motivo per cui la tua app viene uccisa.

L'ho provato su iPhone 3G e iPod 4 gen e riprodurre (con successo) il bug.

0

L'ho visto prima durante il debug e non penso che questo non sia un bug nella tua app.

@Geoffroy ha colpito il chiodo sulla testa, quando ha detto What I have noticed in Xcode 4 is that gdb isn't detached or quitted when you quit the app (I mean forcing it to terminate).

In Xcode 3, smettere l'applicazione comporterebbe SIG_ABORT. Sembra che Xcode 4 gestisca le cose in modo un po 'diverso. Xcode 4 sembra ignorare l'uccisione finché non tocchi di nuovo l'icona, quando si comporta come hai descritto. Interrompi sempre il debugger (facendo clic sul pulsante di arresto generale) prima di eseguire nuovamente l'app e dovresti riuscire a evitarlo.

Non mi preoccuperei di questo in termini di prestazioni della tua app, ma potresti volerlo menzionare nei forum degli sviluppatori Apple o presentare una segnalazione di bug.

Problemi correlati