在 LLDB 中计算 Swift 表达式

Evaluate Swift expressions in LLDB

我想定义一个 Swift 扩展,包括一个方法/计算变量,仅用于 LLDB 调试目的。这是常规 Swift 代码:

extension Collection where Self.Element == Int {
  var elementsOver30: [Self.Element]? {
    return self.filter { [=11=] > 30 }
  }
}

如何在纯 LLDB 中定义此示例中的 elementsOver30?我认为 expression 命令是正确的工具,但我有时会遇到解析错误。

此外,LLDB 中的其他 Swift 符号是否有等效的语法,例如 structs?

在 LLDB

中使用 Swift 代码

大多数 Swift 代码可以作为 LLDB 的一部分执行,如果它是具有正确语法的 stdlib 的一部分。关键是在 type 名称前加上符号标识符 $。我在这里甚至对变量名都使用了 $(新的 LLDB 改进使它变得不必要),因为我更喜欢区分 LLDB 定义。

扩展程序

随着 LLDB 的改进,您实际上可以 copy-paste 表达式后直接 Swift 代码。

为清楚起见,我为您的扩展程序添加了一个带有 $ 个符号的示例:

(lldb) expression
extension Collection where Self.Element == Int {
var $elementsOver30: [Self.Element]? {
return self.filter { [=10=] > 30 }
}
}
(lldb) po [32,31,4].$elementsOver30
▿ Optional<Array<Int>>
  ▿ some : 2 elements
    - 0 : 32
    - 1 : 31

expression 之后按 Enter 会提示一个 multi-line 评估,我们可以在其中输入剩余的 Swift 代码。

Structs/Class 定义

(lldb) expression
struct $Person {
let name: String
}
(lldb) po let $pranav = $Person.init(name: "pranav")
(lldb) po $pranav
▿ $Person
  - name : "pranav"

正在从内存中读取 Swift 个实例

有时,我们需要在 LLDB 中使用 Objective-C 读取 Swift 代码。例如,如果我们有一个带有视图控制器的 Swift 文件:

class LoginViewController: UIViewController {
...
}

我们可以打印内存地址结果的动态类型如下:

(lldb) expr -O --language objc -- 0x14160c260
<SharedSettings.LoginViewController: 0x14160c260>

查看 Swift 文档

使用type lookup阅读类型定义的缩小版本:

(lldb) type lookup Equatable
protocol Equatable {
  static func == (lhs: Self, rhs: Self) -> Swift.Bool
}
extension Swift.Equatable {
  static func != (lhs: Self, rhs: Self) -> Swift.Bool
}