Xcode debug 显示具有两个不同值的相同变量

Xcode debug displays same variable with two different values

提问人:Amadeu Cavalcante Filho 提问时间:8/17/2023 最后编辑:HangarRashAmadeu Cavalcante Filho 更新时间:8/18/2023 访问量:60

问:

Xcode 调试在断点停止后,在“变量视图”上显示两次相同的变量。该变量在断点上有两个值,但只有一个值在代码上有效。例如,下图的情况,实际值是 ,但它显示了一些日期。nil

这是Xcode上的错误吗?或者,我们可以配置 Xcode 以更好地显示变量?

enter image description here

我发现另一个问题 https://stackoverflow.com/a/53135368/4307080,但是该文件夹似乎在 Xcode 14+ 上确实存在,因此我无法对其进行测试。~/Library/Developer/Xcode/UserData/Debugger/

这发生在一个函数上

internal func bindErrorStream(from service: ErrorStreamProvider) {
    service
      .errorStream
      .receive(on: DispatchQueue.background)
      .sink { [weak self] error in
        guard let self else { return }
        
        switch error.cause {
        case .invalidAppVersion:
          self.versionState.value = AppState.Version(isForbidden: true)
          
        case .serviceUnavailable(let retryAfterDate):
          if let retryAfterDate {
            self.apiStatus.value = AppState.APIStatus.undergoingMaintenance(until: retryAfterDate)
          } else {
            self.apiStatus.value = AppState.APIStatus.unavailable
          }
          
          self.scheduleApiStatusReset()
          
        default: break
        }
      }
      .store(in: &disposables)
  }

如果你尝试构建局部变量,你会发现这不是一个简单的范围问题。

(lldb) fr variable -a -F -L
/// ....

0x000000016b6f5b20: retryAfterDate = nil
0x000000016b6f5d50: retryAfterDate = 2001-01-01 00:00:00 UTC
Swift Xcode 调试

评论

0赞 HangarRash 8/17/2023
如果您发布(以文本形式)相关代码,那将非常有帮助。这可能是一个范围问题。
0赞 Amadeu Cavalcante Filho 8/17/2023
@HangarRash编辑了问题并添加了函数,但该变量仅在 中使用,因此它不应该是范围问题switch
0赞 Amadeu Cavalcante Filho 8/17/2023
似乎 Xcode 15 beta 6 解决了这个问题

答:

0赞 HangarRash 8/18/2023 #1

代码如下:

.sink { [weak self] error in
    guard let self else { return }

有两个变量,名为 。有 from 闭包,然后是 的新局部变量。selfweakselfselfguard let

变量视图显示一个可选和一个非可选,反映了这两个变量。Core.ErrorStreamProcessorCore.ErrorStreamProcessorself

这些台词:

case .serviceUnavailable(let retryAfterDate):
    if let retryAfterDate {

定义两个单独的变量。有一个来自 的关联值,然后是声明中声明为局部变量的那个。retryAfterDatecaseif let