LLDB
LLDB 常用调试指令
help
任何命令行工具类的工具都需要这样一个帮助入口, 帮助我们快速熟悉一个新的指令, 使用格式如下:
help expression
查看expression
的使用介绍
可以使用print
、prin
、pri
或者p
, 但是不能使用pr
, 因为LLDB
不能消除和process
的歧义 p/po
po
: 输出值 或者 对象的地址p
: 输出值 + 值类型 + 尹永明 + 内存地址
通过打印相同的实例对象p
对比
(lldb) p p
(Person *) $5 = 0x0000000100550b50
(lldb) po p
<Person: 0x100550b50>
结果中有个$5
, 任何以$
符开头的东西都是存在于LLDB
的命名空间的, 它们是为了帮助我们进行调试而存在的. 除此之外, p
还支持进制转换, 默认p
是十进制打印
p/t
二进制打印
e.g.
(lldb) p/t p (Person *) $1 = 0b0000000000000000000000000000000100000000010101010000101101010000
p/c
数字转十进制字符
(lldb) p/c 66 (int) $9 = B\0\0\0
p/c
打印以空中指的字符串(以
\0
结尾的字符串)p/x
十六进制打印
(lldb) p/x 100 (int) $7 = 0x00000064
(lldb) p/x (float)100.0 (float) $9 = 0x42c80000 (lldb) p/x (double)100.0 (double) $10 = 0x4059000000000000
p/o
八进制打印
(lldb) p/o 100 (int) $6 = 0144
p/d
字符转十进制数字
(lldb) p/d 'A' (char) $8 = 65
expression
在运行时修改环境中的某个值, 这非常有用, 配合断点调试, 帮助我们mock
一些场景
e.g.
expression count = 18
通常简写为e
, 我的习惯是expr
更新UI
通过执行以下命令, 可以在控制台快速查看视图层级
(lldb) po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]
一些断点调试场景下, 可以在LLDB
环境下完成
e.g. 例如在断点下通过在控制台下同构LLDB
的expression
指令调整了某个UIView
控件的背景色, 直接执行一下指令来刷新UI
(lldb) e (void)[CATransaction flush]
补充: 只有程序在继续运行之后才会看到界面的变化. 因为改变的内容必须被发送到渲染服务中,然后显示才会被更新. 渲染服务实际上是一个另外的进程(被称作backboardd
).这就是说即使我们正在调试的内容所在的进程被打断了, backboardd
也是继续运行着的. 因此我们在断点情况下通过LLDB
执行上面的命令,实现了UI的更新操作.
memory read
查看当前对象的内存情况, 简写x
e.g. p
是实例化的一个对象指针
(lldb) x p
0x100550b50: 8d 22 00 00 01 80 1d 00 78 10 00 00 01 00 00 00 ."......x.......
0x100550b60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
使用相同的p
对象, 不同格式输出:
x/4gx
(lldb) x/4gx p 0x100550b50: 0x001d80010000228d 0x0000000100001078 0x100550b60: 0x0000000000000000 0x0000000000000000
x/4gw
(lldb) x/4gw p 0x100550b50: 0x0000228d 0x001d8001 0x00001078 0x00000001
参数解读:
4
: 打印4段, 否则需要眼睛人工分段查看g
: 格式化输出(iOS为小端存储模式, 数据的高字节存储在高地址中,数据的低字节存储在低地址,对比x
与x/4gx
结果,x/4gx
是按照正常的书写格式输出, 低位在右, 高位在左)x
: 每一段以十六进制打印w
:以十六进制打印,但只输出八位
thread
hread backtrace
查看线程和堆栈框架描述的信息
也可以使用
bt
查看线程信息thread backtrace all
可以使用bt all