【问题标题】:How to interactivly play with objects in the Xcode lldb swift repl?如何交互地玩 Xcode lldb swift repl 中的对象?
【发布时间】:2015-07-28 11:13:24
【问题描述】:

假设我有一个涉及从数据库中挑选文档的小程序:

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。我可以玩弄物体等的行为。

有什么提示吗?

【问题讨论】:

    标签: xcode swift lldb


    【解决方案1】:

    我第一次在 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
    

    现在应用程序正在运行,但手势识别器在从左侧而不是从右侧滑动时会起作用。

    【讨论】:

    • 好的,这也很有用~虽然我希望反过来:)
    • 我知道,我也很失望。 :( 我一开始也做了和你一样的梦。但是没有成功,所以我看了 WWDC 2014 的视频,他们对顶层模块注入的事情非常清楚。
    • 请注意,您可以从简单的expr 中获得一些里程,这确实发生在上下文中。我会将其添加到我的答案中。
    • expr 中添加了一个实际的赋值示例。
    • 既然我们有了 Xcode10,那么当前的状态呢?有谁知道现在在 Xcode10 中是否可以从 repl 中的 lldb 中“看到”对象?经过一番搜索后,似乎仍然无法在 swift repl 中看到 lldb 对象,但我希望有人能证明我错了?
    【解决方案2】:

    注意,我在这个问题中描述了“expression”和“repl”之间的目的和区别:

    Xcode 6.1 'Swift REPL built into the Xcode debugger can inspect and manipulate your running app' not working

    也许这将帮助您了解您所看到的相似点和不同点,然后了解它们背​​后的意图。

    【讨论】:

      猜你喜欢
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多