[英]Evaluate Swift expressions in LLDB
我想定义一个 Swift 扩展,包括一个方法/计算变量,仅用于 LLDB 调试目的。 这是常规的 Swift 代码:
extension Collection where Self.Element == Int {
var elementsOver30: [Self.Element]? {
return self.filter { $0 > 30 }
}
}
我如何在纯 LLDB 中定义此示例中的elementsOver30
? 我认为expression
命令是正确的工具,但我有时会遇到解析错误。
此外,LLDB 中的其他 Swift 符号是否有等效语法,如struct
s?
大多数 Swift 代码可以作为 LLDB 的一部分执行,如果它是具有正确语法的标准库的一部分。 关键是在类型名称前加上符号标识符$
。 我在这里使用$
even 作为变量名(新的 LLDB 改进使它变得不必要)因为我更喜欢区分 LLDB 定义。
通过对 LLDB 的改进,您实际上可以在表达式后直接复制粘贴 Swift 代码。
为了清楚起见,我为您的扩展添加了一个带有$
符号的示例:
(lldb) expression
extension Collection where Self.Element == Int {
var $elementsOver30: [Self.Element]? {
return self.filter { $0 > 30 }
}
}
(lldb) po [32,31,4].$elementsOver30
▿ Optional<Array<Int>>
▿ some : 2 elements
- 0 : 32
- 1 : 31
在expression
后按Enter会提示多行计算,我们可以在其中输入剩余的 Swift 代码。
(lldb) expression
struct $Person {
let name: String
}
(lldb) po let $pranav = $Person.init(name: "pranav")
(lldb) po $pranav
▿ $Person
- name : "pranav"
有时,我们需要在 LLDB 中使用 Objective-C 读取 Swift 代码。 例如,如果我们有一个 Swift 文件,其视图为 Controller:
class LoginViewController: UIViewController {
...
}
我们可以打印一个 memory 地址的结果的动态类型,如下所示:
(lldb) expr -O --language objc -- 0x14160c260
<SharedSettings.LoginViewController: 0x14160c260>
使用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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.