Xcode观察器显示“无效表达式”

3
我正在Xcode中浏览一些Swift代码,并且想要查看变量的值。根据许多答案(例如这个)中的建议,我可以将表达式添加到本地变量窗口。
我打的断点是来自Starscream库(由daltoniam创建)的这个片段的最后一行,该库我作为一个pod包含在我的项目中。
for i in 0..<dataLength {
  buffer[offset] = data[i] ^ maskKey[i % MemoryLayout<UInt32>.size]
  offset += 1
}
var total = 0

我已经添加了两个表达式来观察:

  1. buffer[0]
  2. MemoryLayout<UInt32>.size

对于这两个值,我看到的结果都是“无效表达式”:

xcode screenshot

很明显这些表达式并不是无效的。如果它们无效的话,那么在执行前面的几行时就会抛出异常。我错过了什么?我该如何观察而不会得到“无效表达式”的结果?

注意:如果我从lldb提示符中调用p buffer[0],我会得到晦涩的错误信息:

(lldb) p buffer[0]
error: warning: :12:9: warning: initialization of variable
'$__lldb_error_result' was never used; consider replacing with assignment to '_'
or removing it
var $__lldb_error_result = __lldb_tmp_error
~~~~^~~~~~~~~~~~~~~~~~~~
_

error: :19:5: error: value of type 'WebSocket' has no member
'$__lldb_wrapped_expr_72' $__lldb_injected_self.$__lldb_wrapped_expr_72( ^~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~

我尝试过改变podfile(按照Jim的答案),以使它明确获取调试代码:

pod 'Starscream', '~> 3.0.6', :configuration => 'Debug'

我甚至已经尝试过移除Pods,克隆Starscream,并将其作为子项目包含源代码,但仍然出现相同的错误。

1个回答

1
当我停留在某个简单的函数中时,访问UnsafeMutablePointer buffer[0]的表达式在表达式解析器中可以正常工作。从您直接使用expr命令的经验来看,似乎您的问题不在于这个特定的表达式。相反,似乎是您所停留的上下文环境使整个表达式解析器出现了问题。
请确保您没有使用二进制Cocoapods,并且重建了所有代码和使用的所有pods都已使用相同的Swift编译器从头开始进行重建。目前,lldb和swiftc是版本锁定的 - lldb只能调试使用其附带的swiftc构建的程序。
如果这不能解决问题,那么我们需要找出导致问题的特定函数的原因。这似乎是通过向Swift项目(http://bugs.swift.org)提交错误报告来更好地处理的事情。

谢谢。如何“确保您没有使用二进制CocoaPods”? - dumbledad
如果我没记错的话,当你进行安装或更新时,可以选择下载源代码并重新构建它们,或者下载预编译的二进制文件。你必须选择前者。然而,我不使用 CocoaPods,所以我不记得细节了,抱歉。 - Jim Ingham
我在podfile中添加了:configuration => 'Debug',但调试表达式仍然失败。 - dumbledad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接