什么是死亡和爆炸在Swift的exception堆栈?
在运行时崩溃的exception栈中,Swift经常说参数是Dead或者Exploded。 这是什么意思,这对于debugging目的是否重要?
例如:
-> 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上,因为这是对你漂亮的堆栈跟踪和节点打印机的贡献。 截至这篇文章的时候,function专业化的mangler有6个标记它可以适用于一个参数:
-
死
该参数在函数体中是未使用的,可以在一个死亡参数消除阶段中删除。
-
closures
这个论点是封闭的,可能需要进一步的捣毁/解体。
-
不变
这个论点是一个常数。
-
拥有保证
主叫方拥有的参数将所有权转移给被叫方。 因此,这个论点有一个强有力的参考(呼叫者),并保证通过呼叫生活,所以编译器允许调用者省略转移,而是聚合保留自己。
-
SROA
一个标量replace集合通过应该优化这个论点。
-
在价值
参数被标记为inout,但被调用者实际上并没有改变它。
AST节点打印机添加一个标记
-
爆炸
这个值带有一个爆炸模式,这个模式在调用时已经实现了。
对于所有意图和目的,我们只关心Dead
, Owned to Guaranteed
和Exploded
。
唯一可能看起来很神秘的是Exploded
。 Explosion是Swift编译器用来确定将小结构和枚举值解压缩到寄存器的策略的优化构造。 因此,当节点打印机表示一个值是Exploded
,这意味着它已经在调用之前将值解压到寄存器中。
debugging的目的是否重要?
不。
基于我在苹果的开发者库上find的东西,我相信当Swift说这个论点爆炸的时候,它已经扩展到显示这个bug,直到它显示了所有的层和部分的论点。 Swift这样做是为了更容易find嵌套在参数层之间的错误。 我不确定什么是死的意思。 这可能是完全脱离基础,但我认为,因为你在6天内还没有得到答案,我不妨试着澄清你的问题。
死通常意味着该值不再在内存中
不知道这将如何帮助你,除非你真的要潜入大会debugging。
您可能想查看一些在线资源,例如,如何使用Xcode中的debugging器来解决代码问题。