ios - Swift 异常堆栈中的 Dead & Exploded 是什么?

标签 ios xcode swift error-handling stack-trace

在运行时崩溃的异常堆栈中,Swift 经常说参数已死或已爆炸。它是什么意思,对于调试目的是否重要?

例如:

-> 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

谢谢。

最佳答案

What does it mean?

Swift 编译器出于多种原因标记函数参数,主要与内部优化有关。对于您的问题,我们将专注于处理程序,因为这是对您的 pretty stack trace 做出贡献的原因。和节点打印机。截至本文发布时,函数特化 mangler 有 6 个标记可以应用于参数:

  • 死了

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

  • 关闭

    参数是一个闭包,可能需要进一步的修饰/分解。

  • 常量

    参数是一个常量。

  • 拥有保证

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

  • SROA

    A Scalar Replacement of Aggregates pass 应该优化这个论点。

  • 追求值(value)

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

AST节点打印机又加了一个标记

  • 爆炸

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

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

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

does it matter for debugging purposes?

没有。

关于ios - Swift 异常堆栈中的 Dead & Exploded 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30764669/

相关文章:

arrays - 如何在 API 嵌套数组中调用 URL

带有滑动菜单的 iOS 多导航 Controller

ios - Swift - 设置 UIButton 标题而不考虑状态

Swift,自动调整自定义表格 View 单元格的大小

Swift 3 - 将 segue 推送到导航 Controller

swift - 在 case 语句中覆盖一系列字符串?

ios - 在Swift中比较字符串

ios - 在单元测试中使用 xcappdata 文件

ios - UIBezierPath - byRoundingCorners - 矩形

ios - 如何使用 Xcode 11 构建/提交使用 iOS 14 API 构建的应用程序?