在运行时崩溃的异常堆栈中,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
。
唯一似乎仍然令人迷惑的是Exploded
。的爆炸是一个优化构建体夫特编译器使用,以确定从小型结构和枚举到寄存器的策略来解压值。因此,当节点打印机说一个值是时Exploded
,这意味着它已经在调用之前将值解压缩到寄存器中。
调试目的重要吗?
不。
失效通常意味着该值不再在内存中
除非您确实要深入进行Assembly调试,否则不知道这将如何为您提供帮助。
您可能想查看一些在线资源,即,如何在Xcode中使用调试器来解决代码问题。
根据我在Apple开发人员库中所能找到的信息,我相信当Swift说出该参数爆炸时,它已经扩展为显示错误,直到显示出该参数的所有层次和部分。Swift这样做是为了使查找嵌套在参数各层之间的错误变得更加容易。我不确定死亡意味着什么。这可能是完全不合理的,但是我认为既然您在6天内没有得到答案,我不妨尝试澄清一下您的问题。
文章标签:error-handling , ios , stack-trace , swift , xcode
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!
评论已关闭!