一尘不染

Swift的异常堆栈中死了什么东西?

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

谢谢。


阅读 338

收藏
2020-07-07

共1个答案

一尘不染

这是什么意思?

Swift编译器出于多种原因标记函数自变量,这些原因大多与内部优化有关。对于您的问题,我们将集中讨论mangler,因为这正是导致您漂亮的堆栈跟踪和Node
Printer的原因。截止本文发稿时,函数specialization mangler有6个标记可以应用于自变量:

参数在函数主体中未使用,可以在无效参数消除遍历中删除。

  • 关闭

该参数是一个结束符,可能需要进一步修改/分解。

  • 不变

该参数是一个常量。

  • 拥有保证

呼叫者拥有的参数将所有权转移给被呼叫者。因此,该参数具有与之相关的强引用(“调用方”),并保证在整个调用过程中都有效,因此编译器允许调用方取消传输,而聚合保留自身。

  • 斯罗阿

骨料标量替换过程应该优化此参数。

  • 内在价值

该参数标记为inout,但被调用者实际上并未对其进行突变。

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

  • 爆炸了

该值带有在调用时已实现的爆炸模式。

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

唯一似乎仍然令人迷惑的是Exploded。的爆炸是一个优化构建体夫特编译器使用,以确定从小型结构和枚举到寄存器的策略来解压值。因此,当节点打印机说一个值是时Exploded,这意味着它已经在调用之前将值解压缩到寄存器中。

调试目的重要吗?

不。

2020-07-07