2015-06-10 2 views
34

Nello stack di eccezioni per arresti anomali del runtime, Swift spesso dice che gli argomenti sono Morti o Esplosi. Che cosa significa e ha importanza ai fini del debug?What's Dead & Exploded nello stack delle eccezioni di Swift?

Ad esempio:

-> 0x100209cf0 <function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) ->()+44>: brk #0x1 

Grazie.

+0

Domanda simile: http://stackoverflow.com/questions/31397116/what-does-arg-exploded-mean-in-swift-crash-log – JAL

risposta

55

Che cosa significa?

Il compilatore Swift contrassegna gli argomenti della funzione per una serie di motivi, principalmente relativi alle ottimizzazioni interne. Per la tua domanda, ci concentreremo sul mangler, poiché questo è ciò che contribuisce alla tua stampante pretty stack trace e alla stampante del nodo. Fino al momento di questo post, la mangler funzione specializzazione ha 6 segni si possono applicare a un argomento:

  • Morto

    L'argomento è inutilizzato nel corpo della funzione e può essere rimossa in un passaggio di eliminazione argomento morto.

  • chiusura

    L'argomento è una chiusura e può richiedere un'ulteriore mutilazione/demangling.

  • costante

    L'argomento è una costante.

  • appartengono garantito

    Un trasferimenti argomento di proprietà chiamante di proprietà al chiamato. L'argomento ha quindi un forte riferimento associato ad esso [il chiamante] ed è garantito per vivere attraverso la chiamata, in modo che il compilatore consenta al chiamante di elidere il trasferimento e invece di conservare lo stesso.

  • SROA

    Un passaggio Scalar Replacement of Aggregates dovrebbe ottimizzare questo argomento.

  • In Out to value

    Il parametro è stato contrassegnato inout ma il chiamato in realtà non mutano esso.

Il Nodo stampante AST aggiunge un altro marchio

  • Esploso

    Il valore viene fornito con uno schema esplosione che è stato realizzato quando la chiamata è stata fatta.

Per tutti gli effetti abbiamo solo a cuore Dead, Owned to Guaranteed e Exploded.

L'unico che può sembrare ancora mistificante è Exploded. An Explosion è un costrutto di ottimizzazione utilizzato dal compilatore Swift per determinare una strategia per decomprimere i valori dalle piccole strutture e dalle enumerazioni nei registri. Pertanto, quando la stampante del nodo dice che un valore è Exploded, significa che ha già decompresso il valore in registri prima della chiamata.

è importante ai fini del debug?

No.

+2

Ottime informazioni. Dove hai scoperto tutto questo? – jtbandes

+4

Hopper, Joe Groff, Intuition. – CodaFi

+0

Grazie per la tua risposta dettagliata! Vale anche la pena notare che 'specializzazione della firma della funzione 'significa che c'è stato un problema con le API Swift dove Objective-C aveva bisogno di passare un valore di parametro nullo a Swift, ma la versione Swift di questo parametro non era stata digitata come Facoltativo (http: //stackoverflow.com/a/31141957/2415822). – JAL

0

Sulla base di ciò che sono stato in grado di trovare nella libreria di sviluppatori Apple, credo che quando Swift dice che l'argomento è esploso, è stato espanso per mostrare il bug fino a quando non mostra tutti i livelli e le parti dell'argomento. Swift fa questo per rendere più facile trovare bug che sono annidati tra i livelli di un argomento. Non sono sicuro di cosa significhi morto. Questo può essere completamente fuori base, ma immagino che dal momento che non hai ottenuto una risposta in 6 giorni, potrei anche provare a chiarire che sei un problema.

0

Morto di solito significa che il valore non è più in memoria

Non so come questo sta per aiutare a meno che non siate davvero intenzione di tuffarsi in debug Assemblea è.

È possibile controllare alcune risorse online, ad esempio, come utilizzare il debugger in Xcode per risolvere i problemi relativi al codice.