【问题标题】:Swift Debugger intermittently fails to print descriptions for local variablesSwift 调试器间歇性地无法打印局部变量的描述
【发布时间】:2017-10-18 18:23:02
【问题描述】:

几个月来我一直在默默地处理这个问题,最后我觉得有必要在这里问一下。 lldb 中的 'po' 通常会导致以下输出:

(lldb) 错误::3:1:错误:使用未解析的标识符“inView” 观察 ^~~~~~

我正在编写自定义动画视图控制器转换。我暂停了animateTransition(using transitionContext:) 方法。 inView 是在方法开始时定义的局部变量。我在下一行使用它。我想查询它的值。它显示在调试器的“变量视图”部分(但只有名称,没有详细信息)。

所以我认为没有理由不打印出来。

现在,在人们谈论优化之前,这是一个运行默认方案的全新单视图应用程序。 Swift 编译器的默认优化设置对调试配置文件没有优化。这确实是我的项目的设置方式。

那么问题出在哪里??

【问题讨论】:

  • 并非如此。我会继续阅读它。它担心这些本地变量会不确定地打印出来,这让我相信这是不稳定的行为,而不是打印出这些变量的一些有效的固有问题。
  • 它是否与frame variableframe variable inView 一起显示? p 计算任意表达式,这比查找变量要复杂几个数量级。
  • frame variable 似乎可以工作。 po 有时有效,但通常无效。它倾向于在方法的开头(7 行)而不是中间(10-15 行)。它完全不可预测。
  • 这是一个长镜头,我真的不指望它会起作用,但是当 Swift 不起作用时,您可以尝试使用 ObjC:ex -l objc -O -- inView -l 标志让您指定要评估的表达式的语言:即使在 Swift 上下文中停止,您也可以编写 ObjC 表达式。

标签: swift debugging lldb


【解决方案1】:

即使在最低优化级别 (-Onone),swift 编译器也比 clang 在-O0 处为 C 语言所做的优化工作要多得多。 Swift 依赖优化器使其更复杂的基本模型表现良好,即使在-Onone 也需要做一些这样的工作。

调试信息丢失到优化通道的常见症状之一是无法跟踪变量的位置。调试信息记录了变量,但对于某些地址范围无法重建其位置。从您的描述看来,您遇到了这个问题。

这种症状没有任何原因,因为失败是编译器和优化器所有阶段交互的结果。敏捷工程师看到的这种情况越多,他们可以修复的不良路径就越多。所以当你看到这个时请提交错误。相关说明在这里:

https://swift.org/contributing/#reporting-bugs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2014-02-01
    相关资源
    最近更新 更多