什么是Swift的异常堆栈中的死亡和爆炸?

Den*_*er9 41 error-handling xcode stack-trace ios swift

在运行时崩溃的异常堆栈中,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
Run Code Online (Sandbox Code Playgroud)

谢谢.

Cod*_*aFi 65

这是什么意思?

Swift编译器出于多种原因标记函数参数,主要与内部优化有关.对于你的问题,我们将专注于mangler,因为这是你的漂亮堆栈跟踪和节点打印机的贡献.截至本文发表时,函数特化mangler有6个标记可以应用于参数:

  • 该参数在函数体中未使用,可以在死参数消除传递中删除.

  • 关闭

    该论点是一个闭包,可能需要进一步的修改/解码.

  • 不变

    这个论点是一个常数.

  • 拥有保证

    调用者拥有的参数将所有权转移给被调用者.因此,该参数具有与其相关联的强引用[调用者]并且保证通过调用生存,因此编译器允许调用者忽略传输而是聚合保留自身.

  • SROA

    一个聚集的标量替换过程应该优化这种说法.

  • 在价值观中

    参数在inout中标记,但被调用者实际上并没有改变它.

AST节点打印机再添加一个标记

  • 爆炸

    该值带有一个爆炸模式,该模式在调用时已实现.

对于所有意图和目的,我们只关心Dead,Owned to GuaranteedExploded.

唯一可能仍然看似神秘的是Exploded.Explosion是Swift编译器用于确定将值从小结构和枚举解压缩到寄存器的策略的优化构造.因此,当节点打印机显示一个值时Exploded,它意味着它已经在调用之前将值解压缩到寄存器中.

调试目的是否重要?

不.

  • Hopper,Joe Groff,Intuition. (4认同)
  • @JAL绝对没有,除非普通用户恰好是编译工程师;) (4认同)
  • 好消息.你在哪里发现了这一切? (2认同)