在运行时崩溃的异常堆栈中,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编译器出于多种原因标记函数自变量,这些原因大多与内部优化有关。对于您的问题,我们将集中讨论mangler,因为这正是导致您漂亮的堆栈跟踪和Node Printer的原因。截止本文发稿时,函数specialization mangler有6个标记可以应用于自变量:
参数在函数主体中未使用,可以在无效参数消除遍历中删除。
该参数是一个结束符,可能需要进一步修改/分解。
该参数是一个常量。
呼叫者拥有的参数将所有权转移给被呼叫者。因此,该参数具有与之相关的强引用(“调用方”),并保证在整个调用过程中都有效,因此编译器允许调用方取消传输,而聚合保留自身。
骨料的标量替换过程应该优化此参数。
该参数标记为inout,但被调用者实际上并未对其进行突变。
AST节点打印机再添加一个标记
该值带有在调用时已实现的爆炸模式。
对于所有意图和目的,我们只关心Dead,Owned to Guaranteed和Exploded。
Dead
Owned to Guaranteed
Exploded
唯一似乎仍然令人迷惑的是Exploded。的爆炸是一个优化构建体夫特编译器使用,以确定从小型结构和枚举到寄存器的策略来解压值。因此,当节点打印机说一个值是时Exploded,这意味着它已经在调用之前将值解压缩到寄存器中。
调试目的重要吗?
不。