ランタイムクラッシュの例外スタックでは、Swiftは、引数がDeadまたはExplodedであるとしばしば言います。それは何を意味し、デバッグ目的で重要ですか?
例えば:
-> 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
ありがとう。
どういう意味ですか?
Swiftコンパイラは、主に内部最適化に関連するいくつかの理由で関数の引数にマークを付けます。ご質問については、マングラーに焦点を当てます。それが かなりのスタックトレース 、およびNodeプリンター。この投稿の時点では、関数特殊化マネージャーは引数に適用できる6つのマークを持っています:
死者
引数は関数本体では使用されておらず、デッド引数除去パスで削除できます。
閉鎖
引数はクロージャであり、さらにマングル/デマングルが必要になる場合があります。
定数
引数は定数です。
保証付き
呼び出し元が所有する引数は、所有権を呼び出し先に転送します。したがって、引数はそれに関連付けられた強力な参照を持ち[呼び出し元]、呼び出しを通じて存続することが保証されているため、コンパイラは呼び出し元が転送を省略し、代わりに集約を保持します。
[〜#〜] sroa [〜#〜]
Scalar Replacement of Aggregates パスはこの引数を最適化する必要があります。
In Out To Value
パラメータはinoutとマークされていましたが、呼び出し先は実際にはそれを変更していません。
AST Nodeプリンタはもう1つのマークを追加します
分解
この値には、呼び出しが行われたときに実現された爆発スキーマが付属しています。
すべての意図と目的のために、Dead
、Owned to Guaranteed
、Exploded
。
まだ不可解に思われるのはExploded
だけです。 Explosion は、Swiftコンパイラが値を小さな構造体と列挙型からレジスタにアンパックする戦略を決定するために使用する最適化構造です。したがって、 Nodeプリンタは値がExploded
であると言っています。これは、呼び出し前に値をレジスタにアンパックしたことを意味します。
デバッグ目的で重要ですか?
いいえ。
デッドは通常、値がメモリに存在しないことを意味します
実際にアセンブリのデバッグに飛び込むつもりでない限り、これがどのように役立つかわかりません。
Xcodeでデバッガーを使用してコードの問題をトラブルシューティングする方法など、いくつかのオンラインリソースを確認することをお勧めします。
私がAppleの開発者ライブラリで見つけたものに基づいて、Swiftが引数が分解されたと言うとき、それは展開されて、引数。Swiftは、引数のレイヤーの間にネストされたバグを見つけやすくするためにこれを行います。デッドが何を意味するのかわかりません。これは完全にベースから外れている可能性がありますが、 6日以内に回答が得られなかった場合は、問題を明確にしておこうと思います。