在运行时崩溃的异常堆栈中,Swift 经常说参数已死或已爆炸。它是什么意思,对于调试目的是否重要?
例如:
-> 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
谢谢。
最佳答案
What does it mean?
Swift 编译器出于多种原因标记函数参数,主要与内部优化有关。对于您的问题,我们将专注于处理程序,因为这是对您的 pretty stack trace 做出贡献的原因。和节点打印机。截至本文发布时,函数特化 mangler 有 6 个标记可以应用于参数:
死了
参数在函数体中未使用,可以在死参数消除过程中删除。
关闭
参数是一个闭包,可能需要进一步的修饰/分解。
常量
参数是一个常量。
拥有保证
调用者拥有的参数将所有权转移给被调用者。因此,该参数具有与其 [调用者] 相关联的强引用,并保证在调用期间存在,因此编译器允许调用者省略传输,而聚合保留自身。
SROA
A Scalar Replacement of Aggregates pass 应该优化这个论点。
追求值(value)
参数被标记为 inout 但被调用者实际上并没有改变它。
AST节点打印机又加了一个标记
爆炸
该值带有在调用时实现的爆炸模式。
出于所有意图和目的,我们只关心Dead
、Owned to Guaranteed
和Exploded
。
唯一可能仍然令人费解的是 Exploded
。一个Explosion是 Swift 编译器用来确定将值从小型结构和枚举解包到寄存器中的策略的优化构造。因此,当节点打印机说一个值是 Exploded
时,这意味着它已经在调用之前将该值解压到寄存器中。
does it matter for debugging purposes?
没有。
关于ios - Swift 异常堆栈中的 Dead & Exploded 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30764669/