【问题标题】:After change in lldb, false still evaluates to true in if statement在 lldb 中更改后,if 语句中的 false 仍然评估为 true
【发布时间】:2019-04-23 19:30:40
【问题描述】:

在 lldb 中将布尔值更改为 false 后,它仍在评估为 true。这是一个简化版本。

=> 是一个断点

func getCount(actionWasSuccessful successful: Bool) -> Int {
=>  var count = 0

    // (lldb) po successful (returns true)
    // (lldb) exp successful = false
    // (lldb) po successful (returns false)

    if successful {
=>      count += 1 // breakpoint stops here
    } else {
=>      count = 0 // breakpoint should stop here
    }
    return count
}

let count = getCount(successful: true)
print(count) // returns 1

【问题讨论】:

  • 你可能需要睡觉;你传递的是真的:let count = getCount(successful: true) 如果你写它会返回什么:let count = getCount(successful: false)?
  • @ThomasHaz,如果通过了false,它返回 0,正如预期的那样。但是,如果我将 successful 更改为 true,而我在我的问题中将其更改为 false,那也是不正确的。

标签: ios swift lldb


【解决方案1】:

Swift 使用调试信息进行技巧。例如,它保留变量的“影子”副本,将其报告给调试器以解决这样一个事实,即 swift 会积极地删除变量,因为它可以推断它们不再可访问。如果它没有在定义变量的整个块中创建另一个副本,那么当您单步执行该函数时,您的许多局部变量将变得不可用。影子副本保持最新,但目前 lldb 无法将更改从影子推送到实际变量。

卷影副本解决了一个相当严重的调试问题,但代价是通过调试器更改变量值变得更加困难。据我所知,更原则性的问题解决方案并非易事。

请向 bugs.swift.org 提交有关此问题的错误。这将有助于编译器人员正确地确定优先级。

【讨论】:

  • 很好的解释。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 2015-03-15
  • 1970-01-01
  • 2013-05-03
相关资源
最近更新 更多