假设我有一个涉及从数据库中挑选文档的小程序:
let errorDatabase
= NSError(domain: "dk.myproject.couchbase", code: 0, userInfo: nil)
let rev = database.existingDocumentWithID("_design/" + designDocName)
// in xcode I set a break point here
assert(rev != nil)
if rev == nil {
promise.failure(errorDatabase)
}
然后我插入一个断点,运行程序,之后可以执行:
(lldb) po rev
0x00007fad21df61c0
{
ObjectiveC.NSObject = {...}
}
(lldb) print rev.properties["views"]
(AnyObject?) $R29 = Some {
...
完美让我们输入repl
并使用rev
对象:
(lldb) repl
6> rev
repl.swift:6:1: error: use of unresolved identifier 'rev'
rev
^
我可能对swift repl有错误的期望 - 我期待某种python,nodejs或scala repl。我可以玩弄物品等的行为。
任何提示?
答案 0 :(得分:10)
第一次在LLDB中输入repl
时,我希望同样的事情,但我很快就发现,不幸的是你不能这样做。
事实证明,LLDB中的repl正在顶层注入的模块中运行。因此,您可以在此处的repl中定义顶级对象和函数,然后在“普通”lldb中可见:
(lldb) repl
1> func pt() -> CGPoint {
2. return CGPointZero
3. }
4> :
(lldb) po pt()
(0.0, 0.0)
...但反过来却不是这样:你不能在repl中看到你被暂停时的局部变量,因为它们显然不在顶级范围内。
但请注意,您可以在expr
表达式中执行分配。因此,您可以更改局部变量的值,现有对象的属性等,只需说出expr
后跟一个赋值 - 并且此 发生在你暂停的背景。
例如,假设我正在创建一个平移边缘手势识别器,我在这一行的断点暂停:
p.edges = UIRectEdge.Right
现在:
(lldb) th step-over
(lldb) expr p.edges = UIRectEdge.Left
(lldb) continue
现在应用程序正在运行,但是从左侧而不是右侧滑动时手势识别器正常工作。
答案 1 :(得分:1)
注意,我描述了"表达"之间的目的和区别。和" repl"在这个问题:
也许这会帮助你理解相似之处。你看到的差异,然后是他们背后的意图。