Swift的异常堆栈中死了什么东西?

2020/12/12 22:51 · ios ·  · 0评论

在运行时崩溃的异常堆栈中,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节点打印机再添加一个标记

  • 爆炸了

    该值带有在调用时已实现的爆炸模式。

对于所有意图和目的,我们只关心DeadOwned to GuaranteedExploded

唯一似乎仍然令人迷惑的是Exploded爆炸是一个优化构建体夫特编译器使用,以确定从小型结构和枚举到寄存器的策略来解压值。因此,当节点打印机说一个值是时Exploded,这意味着它已经在调用之前将值解压缩到寄存器中。

调试目的重要吗?

不。

失效通常意味着该值不再在内存中

除非您确实要深入进行Assembly调试,否则不知道这将如何为您提供帮助。

您可能想查看一些在线资源,即,如何在Xcode中使用调试器来解决代码问题。

根据我在Apple开发人员库中所能找到的信息,我相信当Swift说出该参数爆炸时,它已经扩展为显示错误,直到显示出该参数的所有层次和部分。Swift这样做是为了使查找嵌套在参数各层之间的错误变得更加容易。我不确定死亡意味着什么。这可能是完全不合理的,但是我认为既然您在6天内没有得到答案,我不妨尝试澄清一下您的问题。

本文地址:http://ios.askforanswer.com/swiftdeyichangduizhanzhongsileshenmedongxi.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!