常常羡慕前端开发、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"
}
}
程序报错,可以 bt 一下
用 bt,看下当前函数调用情况
bt, thread b

本文介绍了如何利用lldb的Scripting Bridge框架进行调试,包括基础的lldb命令、Python脚本扩展、Xcode断点的使用以及通过nudge脚本修改移动控件布局。强调了lldb的Python接口可以实现定制化和动态调试,简化了UI全局断点和刷新界面的过程。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



