Swift 的异常堆栈中的 Dead & Exploded 是啥?

Posted

技术标签:

【中文标题】Swift 的异常堆栈中的 Dead & Exploded 是啥?【英文标题】:What's Dead & Exploded in Swift's exception stack?Swift 的异常堆栈中的 Dead & Exploded 是什么? 【发布时间】:2015-08-26 04:43:40 【问题描述】:

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

谢谢。

【问题讨论】:

类似问题:***.com/questions/31397116/… 【参考方案1】:

什么意思?

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

死亡

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

关闭

该参数是一个闭包,可能需要进一步的修改/拆解。

常数

参数是一个常数。

所有权归保证

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

SROA

Scalar Replacement of Aggregates 传递应该优化此参数。

进出价值

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

AST 节点打印机再添加一个标记

爆炸

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

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

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

调试是否重要?

没有。

【讨论】:

很棒的信息。您是从哪里得知这一切的? 霍珀,乔·格罗夫,直觉。 感谢您的详细解答!还值得注意的是,function signature specialization 表示 Swift API 存在问题,其中 Objective-C 需要将 nil 参数值传递给 Swift,但该参数的 Swift 版本未键入为 Optional (***.com/a/31141957/2415822) . @JAL 我不认为这是正确的解释。他描述的案例与可能产生的错误消息之间可能存在某种关联,但 AFAIK 这些消息是在编译时生成的,仅用于跟踪堆栈跟踪的优化。 @JAL 绝对没有,除非普通用户恰好是编译器工程师 ;)【参考方案2】:

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

除非您真的要深入了解汇编调试,否则不确定这对您有什么帮助。

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于Swift 的异常堆栈中的 Dead & Exploded 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Swift教程_swift常见问题(0005)_完美解决Cannot override &#39;dealloc&#39;异常

导致堆栈溢出异常的嵌套 JSF 复合组件

Swift开发之异常处理及断言

如何在 Swift 中的集合视图上方添加水平按钮堆栈?

如何在 Swift 中正确实现方向数组缩减挑战中的堆栈

dead loopcontinue & breakwhile...else语句