当前位置: 首页 > 面试题库 >

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

朱渝
2023-03-14
问题内容

在运行时崩溃的异常堆栈中,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,这意味着它已经在调用之前将值解压缩到寄存器中。

调试目的重要吗?

不。



 类似资料:
  • 问题内容: 如何将异常的堆栈跟踪信息打印到stderr以外的流上?我发现的一种方法是使用getStackTrace()并将整个列表打印到流中。 问题答案: 可以接受or或参数: 也就是说,请考虑将SLF4J之类的记录器接口与LOGBack或log4j之类的记录实现一起使用。

  • 问题内容: 这可能是一个非常幼稚的问题。 我曾经相信Java 中的a 总是 包含堆栈跟踪。这是正确的吗? 现在看起来我捕获了 没有 堆栈跟踪的异常。是否有意义?是否 可以 在没有堆栈跟踪的情况下捕获异常? 问题答案: 无需堆栈跟踪就可以捕获Java中的Throwable对象: 构造一个具有指定详细消息,原因,启用或禁用原因,启用或禁用 可写堆栈跟踪 的新throwable 。 填写执行堆栈跟踪。此

  • 现在看来,我在没有堆栈跟踪的情况下捕获异常。有道理吗?是否有可能在没有堆栈跟踪的情况下捕获异常?

  • 我从下面的地方得到了NullPointException。 因为我使用ThreadPoolExecutor,并在此thread方法中获得异常。然后我有其他方法重写AfterExecute: 之后: 为什么日志不同?如果有人能解释原因,我真的很感激。

  • 这是关于stackoverflow的第一个问题,所以我将尽量具体地说明。我在论坛上搜索任何相关的话题,但没有运气。总之是这样的: 多亏了@whozcraig的建议,我已经设法在调用堆栈上获得了一条更有意义的消息。但还是被难倒了。 ihr.exe!_mbscmp(常量无符号字符*s1=0x00FE8C10,常量无符号字符*s2=0x00FE8C10)行84+0xF字节 ihr.exe!_mbscmp

  • 问题内容: 尽管堆栈跟踪在Python中很有用,但最常见的是问题根源上的数据丢失- 是否有办法确保至少将locals()(可能还有globals())添加到打印的堆栈跟踪中? 问题答案: 您可以安装自己的异常挂钩,并从那里输出所需的内容: 要在回溯中从 每个 帧打印var ,请将上述循环更改为