Xcode 的“po”无法识别我想研究的变量。有吗?

Posted

技术标签:

【中文标题】Xcode 的“po”无法识别我想研究的变量。有吗?【英文标题】:Xcode's 'po' fails to identify the variable I wish to study. Wny? 【发布时间】:2014-07-27 02:11:14 【问题描述】:

环境:Xcode 6 Beta 4 我正在尝试仅使用 调试器。但是调试器无法识别静态变量(通过“Let”)。 vars 也是如此。

为什么?

func textFieldShouldReturn(textField:UITextField) -> Bool 
    let myText = "Hello World"
    let theText = textField.text! as String
    return true

这是调试器的结果:

(lldb) po textField 错误::1:1: 错误:使用未解决 标识符 'textField' textField ^ :11:5: 错误:使用 未解析的标识符“$__lldb_injected_self” $__lldb_injected_self.$__lldb_wrapped_expr_29( ^ (lldb) po myText 错误::1:1:错误:使用未解析的标识符“myText”myText ^:11:5:错误:使用未解析的 标识符“$__lldb_injected_self” $__lldb_injected_self.$__lldb_wrapped_expr_30( ^(lldb)po theText错误::1:1:错误:使用未解析的标识符'theText'theText ^:11:5:错误:使用未解析的 标识符“$__lldb_injected_self” $__lldb_injected_self.$__lldb_wrapped_expr_31( ^ (lldb)

注意:调试输出设置为“所有输出”。

截图如下:

【问题讨论】:

当您尝试此操作时,您是否在该函数内的断点处停止? 断点在function()内。 好的,只是想确认一下。鉴于此,不幸的是,我不知道出了什么问题。但现在这是一个格式正确的问题,+1。 代码工作...能够处理文本。但是调试器很糟糕。 我怀疑调试器不是太 Swift。部分原因是它被varlet 混淆了,我怀疑它可能无法找到this 在另一种情况下。 【参考方案1】:

这个问题我也遇到过,我觉得是调试器的bug。如果您不使用任何用 'let' 声明的变量,则 po 命令将起作用。这当然不是你想要的,所以我就这个问题向 Apple 提交了一个错误。

我认为您应该只希望它在下一个测试版中得到修复(也请提交错误,因为提交的错误数量会影响 Apple 修复它们的优先级)。与此同时,请使用 Amitays 解决方法。

【讨论】:

这绝对是 Swift 相关的问题。 Objective-C 版本有效。所以我向 Apple 提交了一个错误:报告 #17823710。 Xcode 8.2.1 仍然存在问题。看来他们没有任何修复它的计划!【参考方案2】:

正如上面其他人所证实的,这几乎是 Swift / LLDB 中的一个错误。它主要从 6.1.1 开始工作,在 6.3 Beta 1 或之前损坏,并在 6.3 Beta 2 中再次修复。

我只是使用命令行应用程序作为测试,无法使用 UIKit 进行测试,但我在 UIKit 之外看到了类似的问题 - 问题是指我得到了像 OP 这样的结果,但现在是工作:

struct Foobar 
    var foo:String
    var bar:String


func textFieldShouldReturn() -> Bool 
    let fubar = Foobar(foo: "Onesy", bar: "Twosy")
    let myText = "Hello World"
    return true


textFieldShouldReturn()

p 和 po 产生的结果略有不同,取决于是否实现了 Printable:

(lldb) po fubar
(foo = "Onesy", bar = "Twosy")

(lldb) p fubar
(AssertClientMacDirect.Foobar) $R1 = (foo = "Onesy", bar = "Twosy")

这里的线程:https://devforums.apple.com/message/1111705#1111705,您也可以使用image lookup -t <SymbolName> 命令

image lookup -t Fubar

<path redacted>
id = 0x1000003e0, name = "AssertMac.Fubar", byte-size = 8, clang_type = "class Fubar 
class func `new`(name: Swift.String) -> AssertMac.Fubar
init(name: Swift.String)
func test()
var someValue: Swift.String
var name: Swift.String
@objc deinit

值得强调的是,您应该仔细检查 Swift 编译器是否设置为:

调试/优化 -> 无, 复制时去除符号 -> 否, 链接时间优化 -> 否 安装时去除符号 -> 否,(适用于调试版本)

如果您在 swift 类上实现 Printable,那么您将获得 description 属性的结果。

以前存在 Xcode 错误,即在尝试单步执行优化代码时 Xcode 会崩溃。

【讨论】:

以上是关于Xcode 的“po”无法识别我想研究的变量。有吗?的主要内容,如果未能解决你的问题,请参考以下文章

UI 测试 xCode 7.3 - 无法在控制台中打印变量(即“po app”):(无法构建 Objective-C 模块“Bolts”)

iOS xcode使用断点追踪后,无法nslog,无法po对应的值 方法小结

Oracle 12c 无法识别 JSON 类型

Xcode 无法识别新的 Swift 类

命令行打开记事本的命令是notepad。我想用这个命令打开其他exe文件怎么做?环境变量里面有吗?

Xcode 中的 Python 语法高亮显示