Swift 的异常堆栈中有什么 Dead & Exploded?

What's Dead & Exploded in Swift's exception stack?

在运行时崩溃的异常堆栈中,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

谢谢。

根据我在 Apple 的开发人员库中找到的内容,我相信当 Swift 说参数被分解时,它已经被扩展以显示错误,直到它显示所有层和部分争论。 Swift 这样做是为了更容易找到嵌套在参数层之间的错误。我不确定死是什么意思。这可能完全不对,但我认为既然你在 6 天内没有得到答复,我不妨试着澄清你的问题。

Dead 通常意味着该值不再存在于内存中

不确定这对您有何帮助,除非您真的要深入调试程序集。

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

What does it mean?

Swift 编译器出于多种原因标记函数参数,主要与内部优化有关。对于您的问题,我们将重点关注 mangler,因为它对您的 pretty stack trace 和 Node Printer 有贡献。截至本文 post 时,函数专业化 mangler 有 6 个标记可以应用于参数:

  • 死了

    参数在函数体中未使用,可以在死参数消除过程中删除。

  • 关闭

    参数是一个闭包,可能需要进一步 mangling/demangling。

  • 常量

    参数是常数。

  • 拥有保证

    调用者拥有的参数将所有权转移给被调用者。因此,该参数具有与之关联的强引用 [调用者] 并保证通过调用存在,因此编译器允许调用者省略传输,而聚合保留自身。

  • SROA

    Scalar Replacement of Aggregates 传球应该优化这个论点。

  • 输入输出值

    参数被标记为 inout 但被调用者实际上并没有改变它。

AST节点打印机多加一个标记

  • 爆了

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

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

唯一可能仍然令人费解的是 ExplodedExplosion 是一种优化构造,Swift 编译器用于确定将值从小型结构和枚举解包到寄存器中的策略。因此,当节点打印机说一个值是 Exploded 时,这意味着它在调用之前已经将该值解压缩到寄存器中。

does it matter for debugging purposes?

没有。