2014-06-12 18 views
9

L'applicazione My Swift in esecuzione nel simulatore iOS viene arrestata nel debugger con errore di runtime EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, sub code=0x0).Diagnosi EXC_BAD_INSTRUCTION nella libreria standard Swift

Secondo lo standard WWDC 2014 Session 409, questo in genere è dovuto a un errore di asserzione.

Nella versione beta di sviluppo corrente di Xcode 6, la traccia dello stack del debugger e l'errore sopra riportato non forniscono informazioni sufficienti per vedere qual è il problema. Come faccio a sapere dove si trova il problema?

risposta

5

sembra che la fonte più comune di questo errore (al momento della stesura di questo: Xcode 6 Beta 1) è che alcune proprietà facoltativa implicitamente scartato o variabile è nil.

Per comodità, la maggior parte delle API di Objective-C sono collegate a Swift con implicitly unwrapped optionals. Essi sono indicati con punto esclamativo dietro la dichiarazione del tipo: AnyObject[]!

  • Se il debugger si interrompe nel codice, fare doppio verificare che la linea e cercare optional implicitamente da scartare che potrebbero essere nil lì.

  • A volte il debugger si arresta con quell'errore di runtime nella libreria di sistema Swift. Ciò accade ad esempio quando si passa una chiusura a metodi di raccolta come filter, map, reduce e così via. L'errore di runtime si verifica quindi nel sito di chiamata di tali funzioni della libreria, ma la definizione potrebbe trovarsi in parti diverse del codice, in cui è stata definita la funzione/chiusura. Guardate lì per gli optionals implicitamente non aperti che potrebbero essere nul in fase di runtime.

Per difendersi agains questi tipi di errori essere consapevoli del fatto che, anche se il compilatore Swift non ti costringono a gestire il potenziale nil valori restituiti dal cacao, si dovrebbe usare optional binding, optional chaining o optional downcasting ovunque il valore restituito da Obiettivo -C terra potrebbe essere nil.

Speriamo che le versioni future del compilatore Swift inizieranno a emettere messaggi diagnostici ed errori più utili per questo tipo di problema comune!

+1

In Beta 3, si ottiene ora un messaggio di console sull'effetto di "Un facoltativo unwrapped facoltativo ha avuto un valore nullo". –

3

Ho trovato (dopo molte ore) che questo errore può apparire sulla linea sbagliata.

Per esempio

enter image description here

Come si può vedere l'applicazione si blocca dove sto controllando per nullo, ma poi 'continua' attraverso, perché stampa le dichiarazioni. Va quindi 'indietro' e si blocca.

Sono giunto alla conclusione che esiste un bug di mapping di origine in XCode (7) in cui una variabile nil non viene spostata. In questo caso, ho avuto una variabile (molto più in basso nel mio codice) che era nulla ed è stata scartata.

Il problema, naturalmente, è che il compilatore non ha bandiera la variabile reale che era pari a zero, è segnalato qualcosa di completamente diverso.

Quindi, se si esegue in questo brutto bug, passare attraverso tutte le possibili variabili che possono essere pari a zero e verificare la presenza di togliere l'involucro.Probabilmente stai scartando un nulla, non è proprio quello che dice il compilatore.

Come menzionato nel commento c'è l'ottimizzazione del compilatore. Ecco un link per risolvere il problema (e trovare il percorso causa del crash)

xcode 6.1 how to disable optimization (Swift)

+2

Dalla tua descrizione sembra che il tuo incidente si verifichi in una build ottimizzata, direi? Se è così, è abbastanza possibile che il compilatore abbia fatto un po 'di riordino del codice durante l'ottimizzazione, quindi ... ;-) – Palimondo

+0

Sì, disattivarlo porta alla linea che effettivamente ha bisogno di rimedio – Aggressor

0

Ho avuto lo stesso problema come Palimondo. Fortunatamente, si trattava semplicemente di assicurarsi di aver inizializzato l'articolo in anticipo. Nel mio codice, stavo chiamando una funzione per posizionare le immagini in UIImageViews e passare un elemento da un array. Non avevo ancora caricato il mio array con UIImageViews, e quindi quando il codice sarebbe stato eseguito direi che stavo passando in un elemento inesistente dell'array. Una volta che mi sono assicurato di caricare il mio array all'inizio del programma, l'errore è andato via.

Problemi correlati