常常羡慕前端开发、RN 、Flutter 和 SwiftUI 开发的 live rendering, 即时渲染
别家项目的框架,UI 开发,修改了,很容易渲染出来。无需每次手动漫长的编译
其实,lldb 自带了一个 python 解析器。要调试代码逻辑,不需要重新编译, kill 进程。
当前进程下,可以直接调试。
常用的是,苹果封装的一些命令。也可以根据自己的工程,自己写定制化的 python 脚本
基础:先搞清楚常用命令的含义
常用三连,p
、po
、 v
lldb 很强大,开发者常用 p
、po
、 v
- 使用
p
、po
、v
, 查看当前函数帧的变量
po
, expression --object-description , 使用对象描述的表达式,简单理解为 print object ,打印对象
p
, expression, 就是不带对象描述的 po,
p
、po
只是 lldb 中,简单的别名。
v
, frame variable, 函数帧变量
Swift 中,编译时声明的类型,可以与运行时赋值过去的类型,不一致。
v
多了一个类型解析功能,Type Resolution
p
、po
,是根据编译时的数据类型操作。当然可以用as
做一个类型强转,cast 到运行时的类型。
v
,可以直接取出实际数据,也就是运行时的数据。( 如果编译与运行类型不一致,lldb 中需要手动输入字符串,没有代码自动补全)
- 通过
p
、po
,执行代码语句
看数据,v
优先。执行代码语句, p
、po
优先。
v
直接访问调试信息,直接读内存。步骤相对少,
p
、po
需要去解析和执行。多了一些 JITing,跑代码的工作。
这些在 Xcode 的控制台,点一下暂定按钮, 开启 lldb, 都可以知道的
help 大法好
- 看看
p
(lldb) help p
Evaluate an expression on the current thread.
// ...
'p' is an abbreviation for 'expression --'
// p 是 expression -- 的缩写
- 看看
po
(lldb) help po
Evaluate an expression on the current thread. Displays any returned value
// ...
'po' is an abbreviation for 'expression -O --'
// po 是 expression -O -- 的缩写
- 看看
v
(lldb) help v
// v 怎么用的,说的很清楚
// ...
'v' is an abbreviation for 'frame variable'
// v 是 frame variable 的缩写
简单的例子:
代码
struct Trip{
var name: String
var destinations: [String]
}
extension Trip: CustomDebugStringConvertible{
var debugDescription: String{
"Trip 的描述"
}
}
func one(){
let cruise = Trip(name: "Alone", destinations: ["Pain", "Great", "V", "me"])
// 断点于此
print("Place Holder")
}
one()
print("Place Holder")
结果:
(lldb) po cruise
▿ Trip 的描述
- name : "Alone"
▿ destinations : 4 elements
- 0 : "Pain"
- 1 : "Great"
- 2 : "V"
- 3 : "me"
(lldb) expression --object-description -- cruise
▿ Trip 的描述
- name : "Alone"
▿ destinations : 4 elements
- 0 : "Pain"
- 1 : "Great"
- 2 : "V"
- 3 : "me"
(lldb) p cruise
(One.Trip) $R18 = {
name = "Alone"
destinations = 4 values {
[0] = "Pain"
[1] = "Great"
[2] = "V"
[3] = "me"
}
}
(lldb) expression cruise
(One.Trip) $R20 = {
name = "Alone"
destinations = 4 values {
[0] = "Pain"
[1] = "Great"
[2] = "V"
[3] = "me"