在 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 符号是否有等效的语法,例如 struct
s?
在 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
}
我想定义一个 Swift 扩展,包括一个方法/计算变量,仅用于 LLDB 调试目的。这是常规 Swift 代码:
extension Collection where Self.Element == Int {
var elementsOver30: [Self.Element]? {
return self.filter { [=11=] > 30 }
}
}
如何在纯 LLDB 中定义此示例中的 elementsOver30
?我认为 expression
命令是正确的工具,但我有时会遇到解析错误。
此外,LLDB 中的其他 Swift 符号是否有等效的语法,例如 struct
s?
在 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
}