Dans la pile des exceptions pour les pannes d'exécution, Swift dit souvent que les arguments sont Dead ou Exploded. Qu'est-ce que cela signifie et est-ce important pour le débogage?
Par exemple:
-> 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
Merci.
Qu'est-ce que ça veut dire?
Le compilateur Swift repère les arguments de fonction pour un certain nombre de raisons, principalement liées à des optimisations internes. Pour votre question, nous allons nous concentrer sur le modérateur, car c’est ce qui contribue à votre jolie trace de pile , et à l’imprimante de nœud. À la date de cet article, la spécialisation fonction mangleur a 6 points pouvant être appliqués à un argument:
Morte
L'argument est inutilisé dans le corps de la fonction et peut être supprimé en une passe d'élimination d'argument mort.
Fermeture
L'argument est une fermeture et peut nécessiter davantage de démêlage/démêlage.
Constant
L'argument est une constante.
Appartenant à garanti
Un argument appartenant à l'appelant transfère la propriété à l'appelé. L'argument est donc associé à une référence forte [l'appelant] et est garanti pour vivre l'appel. Le compilateur autorise donc l'appelant à annuler le transfert et à la place, l'agrégat se conserve.
SROA
Un remplacement scalaire d'agrégats devrait optimiser cet argument.
In Out To Value
Le paramètre était marqué inout mais l'appelé ne le mute pas en réalité.
L'imprimante de nœud AST ajoute une marque supplémentaire
A éclaté
La valeur est fournie avec un schéma d'explosion qui a été réalisé lors de l'appel.
À toutes fins utiles, nous nous préoccupons uniquement de Dead
, Owned to Guaranteed
et Exploded
.
Le seul qui puisse encore paraître mystifiant est Exploded
. Une explosion est une construction d'optimisation utilisée par le compilateur Swift pour déterminer une stratégie permettant de décompresser les valeurs de petites structures et d'énums dans des registres. Ainsi, lorsque l’imprimante de noeud indique qu’une valeur est Exploded
, cela signifie qu’elle a déjà décompressé la valeur dans des registres avant l’appel.
est-ce important pour le débogage?
Nan.
Dead signifie généralement que la valeur n'est plus en mémoire
Vous ne savez pas comment cela va vous aider à moins que vous ne plongiez vraiment dans le débogage de l’Assemblée.
Vous voudrez peut-être consulter certaines ressources en ligne, à savoir comment utiliser le débogueur de Xcode pour résoudre les problèmes liés à votre code.
D'après ce que j'ai pu trouver dans la bibliothèque de développeurs d'Apple, je pense que lorsque Swift dit que l'argument est éclaté, il a été développé pour afficher le bogue jusqu'à ce qu'il affiche toutes les couches et parties de l'argument. Swift facilite ainsi la recherche des bogues imbriqués entre les couches d'un argument. Je ne suis pas sûr de ce que signifie "mort". C'est peut-être complètement hors de la base, mais je suppose que puisque vous n'avez pas eu de réponse dans 6 jours, je pourrais aussi bien essayer de clarifier votre problème.