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节点打印机多加一个标记
爆了
该值带有调用时已实现的爆炸模式。
出于所有意图和目的,我们只关心 Dead
、Owned to Guaranteed
和 Exploded
。
唯一可能仍然令人费解的是 Exploded
。 Explosion 是一种优化构造,Swift 编译器用于确定将值从小型结构和枚举解包到寄存器中的策略。因此,当节点打印机说一个值是 Exploded
时,这意味着它在调用之前已经将该值解压缩到寄存器中。
does it matter for debugging purposes?
没有。
在运行时崩溃的异常堆栈中,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节点打印机多加一个标记
爆了
该值带有调用时已实现的爆炸模式。
出于所有意图和目的,我们只关心 Dead
、Owned to Guaranteed
和 Exploded
。
唯一可能仍然令人费解的是 Exploded
。 Explosion 是一种优化构造,Swift 编译器用于确定将值从小型结构和枚举解包到寄存器中的策略。因此,当节点打印机说一个值是 Exploded
时,这意味着它在调用之前已经将该值解压缩到寄存器中。
does it matter for debugging purposes?
没有。