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。部分原因是它被var
和let
混淆了,我怀疑它可能无法找到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对应的值 方法小结