debugging Xcode debug显示同一个变量有两个不同的值

4ioopgfo  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(104)

Xcode debug在断点处停止后,在“Variables View”上显示了两次相同的变量。该变量在断点处有两个值,但只有一个值在代码中有效。例如下图的情况,真实的值是nil,但它显示了一些日期。
这是Xcode上的一个bug吗?或者,我们可以配置Xcode以更好的方式显示变量?

我发现另一个问题https://stackoverflow.com/a/53135368/4307080,但是文件夹~/Library/Developer/Xcode/UserData/Debugger/似乎在Xcode 14+上已经存在,因此我无法测试。
这是发生在函数上的

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
wmtdaxz3

wmtdaxz31#

代码如下:

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

有两个名为self的变量,一个是来自闭包的weakself,另一个是来自guard let的新局部变量self
变量视图显示了一个可选的Core.ErrorStreamProcessor和一个非可选的Core.ErrorStreamProcessor,反映了这两个self变量。
线路:

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

定义两个独立的retryAfterDate变量。一个是来自case的关联值,另一个是在if let语句中声明为局部变量的变量。

相关问题