在运行时崩溃的异常堆栈中,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
感谢。
答案 0 :(得分:62)
这是什么意思?
Swift编译器出于多种原因标记函数参数,主要与内部优化有关。对于您的问题,我们将专注于管理器,因为它对您的pretty stack trace和节点打印机有所贡献。截至本文发表时,函数特化mangler有6个标记可以应用于参数:
<强>死强>
该参数在函数体中未使用,可以在死参数消除传递中删除。
<强>封闭强>
参数是一个闭包,可能需要进一步修改/解除。
<强>恒强>
论证是常数。
拥有保证
调用者拥有的参数将所有权转移给被调用者。因此,该参数具有与其相关的强引用[调用者]并且保证通过调用生存,因此编译器允许调用者忽略传输而是聚合保留自身。
<强> SROA 强>
Scalar Replacement of Aggregates传递应优化此参数。
Out To Value
参数标记为inout但被调用者实际上没有变异。
AST节点打印机再添加一个标记
<强>分解强>
该值附带一个在调用时已实现的爆炸模式。
出于所有意图和目的,我们只关心Dead
,Owned to Guaranteed
和Exploded
。
唯一可能仍然看似神秘的是Exploded
。 Explosion是Swift编译器用于确定将值从小结构和枚举解压缩到寄存器的策略的优化构造。因此,当节点打印机表示值为Exploded
时,它意味着它已经在调用之前将值解压缩到寄存器中。
是否对调试有用?
不。
答案 1 :(得分:0)
根据我在Apple的开发人员库中找到的内容,我相信当Swift说这个论点爆炸时,它已经扩展到显示bug,直到它显示参数的所有层和部分。 Swift这样做可以更容易地找到嵌套在参数层之间的bug。我不确定死是什么意思。这可能完全偏离基础,但我认为既然你在6天内没有得到答案,我不妨试着澄清你的问题。
答案 2 :(得分:0)
死亡通常意味着该值不再存在于内存中
不确定这对你有什么帮助,除非你真的要深入调试程序集。
您可能需要查看一些在线资源,例如,如何在Xcode中使用调试程序来解决代码问题。