如何在带有LLDB的Swift应用程序中绘制变量的值?
之前它就像po variable_name
现在我经常遇到一些令人讨厌的错误,例如:
(lldb) po a
error: <EXPR>:11:5: error: use of unresolved identifier '$__lldb_injected_self'
$__lldb_injected_self.$__lldb_wrapped_expr_2(
^
答案 0 :(得分:18)
这个错误听起来可能是因为DWARF没有告诉LLDB在哪里找到你的&#34; self&#34;宾语。鉴于Swift的性质,LLDB需要知道self的类型才能在本地范围内注入表达式 找出这是否是您的问题的一种方法是在LLDB提示下进行:
(lldb)帧变量-L self
你可能不会看到它的位置。值得提交错误报告,只是为了追踪你的具体责备案例
无论如何,要解决你的大部分问题。在Swift中,没有语言认可的机制用于&#34;打印描述&#34;就像ObjC一样,所以虽然你可以键入&#34; po self&#34 ;,除非self是Objective-C类型,你几乎可以看到同样的事情&#34; p self&#34;甚至&#34;框架变量自我&#34;会告诉你 - 这完全基于LLDB数据格式化机制。如果您想要自定义Swift对象的外观,那么强制性参考是:http://lldb.llvm.org/varformats.html
答案 1 :(得分:3)
我做了一些测试来弄清楚它如何与Swift一起工作,结果让我感到有些惊讶。使用ObjC对象po
调用debugDescription
,默认情况下调用description
。这很清楚。不幸的是,使用Swift类时同样不适用。我专注于对象而不是打印单个变量。
要使其工作(po
中的lldb
命令),我必须覆盖描述。我用于测试的代码如下:
class Test : NSObject
{
var name : String?
var surname : String?
override var debugDescription : String{
return "debugDescription method"
}
override var description : String {
return "description Method"
}
}
测试:
let test = Test()
test.name = "name"
test.surname = "surname"
(lldb) po test
description Method
(lldb) p test
(DebugTest.Test) $R1 = 0x00007fce11404860 {
ObjectiveC.NSObject = {
isa = DebugTest.Test
}
name = "name"
surname = "surname"
}
(lldb) po dump(test)
▿ DebugTest.Test #0
- super: debugDescription method
▿ name: name
- Some: name
▿ surname: surname
- Some: surname
description Method
(lldb) po print(test)
description Method
让我感到惊讶的是,Swift对象上的po
调用description
而不是debugDescription
与ObjC不同。
修改强>
为了使其与ObjC一样,您的类必须实现CustomDebugStringConvertible,然后po
将调用debugDescription
,默认情况下会调用description
。在我的例子中唯一需要改变的是添加:
class Test : NSObject, CustomDebugStringConvertible
选中XCode 7.0.1
和iOS SDK 9
,Swift 2.0
答案 2 :(得分:1)
对于Xcode beta4,我可以确认相同的错误 帧变量-L self
显示某些内容,但似乎最糟糕:
:( SwiftCollectionViewSample.DetailViewController)self =
我肯定会提交一个错误,Enrico
17819707调试器打印错误:使用未解析的标识符&#39; $ __ lldb_injected_self&#39;
答案 3 :(得分:0)
此页面中关于运行description
时快速默认返回lldb) po
的好答案
如果有帮助,当使用lldb和Swift对象遇到错误时,我总是想找个好地方。
首先,告诉lldb您处于Swift上下文中(不是Objective-C):
(lldb) settings set target.language swift
然后,我将始终仔细检查导入的框架。
lldb) exp import WebKit
(lldb) expr let $ds = unsafeBitCast(0x6000006d74b0, to: WKWebsiteDataStore.self)
(lldb) po $ds
<WKWebsiteDataStore: 0x6000006d74b0>