给函数设置断点
breakpoint set -n test
breakpoint set -n touchesBegan:withEvent:
breakpoint set -n "-[ViewController touchesBegan:withEvent:]"
给指定函数地址加断点
breakpoint set -a 函数地址
breakpoint set -r est (正则,包含est的函数都断点)
breakpoint set -s 动态库 -n 函数名
查看指令的用法
help breakpoint、help breakpoint set
expression --
执行一个表达式
也可简写为e
expression self.view.backgroundColor = [UIColor redColor]
// 刷新界面
(lldb) expression -- (void)[CATransaction flush]
备注,如果是用地址的话一定要强转
po [(UIView *)0x15dd0e080 nextResponder]
查看父类
po [0x1229eb200 superclass]
TBCBaseViewController
查看视图结构
po [self.view recursiveDescription]
expression、expression --和指令print和p、call?的效果一样
expression -O --和指令po的效果一样
thread backtrace
打印线程的堆栈信息
和指令bt的效果一样
thread return []
让函数直接返回某个值,不会执行断点后面的代码
frame variable []
例如可以写 frame variable a
打印当前栈帧的变量
不带参数就是打印所有
断点调试
thread continue、continue、c 程序继续运行
thread step-over、next、n 单步运行,把子函数当做整体一步运行
thread step-in、step、s 单步运行,遇到子函数会进入子函数
thread step-out、finish 直接执行完当前函数的所有代码,返回到上一个函数
thread step-inst-over、nexti、ni
thread step-inst、stepi、si
si、ni和s、n类似
s、n?是源码级别
si、ni?是汇编指令级别
breakpoint list 列出所有的断点
breakpoint disable 断点编号:禁用断点
breakpoint enable 断点编号:启用断点
breakpoint delete 断点编号:删除断点
breakpoint command add 断点编号
给断点预先设置需要执行的命令,到触发断点时,就会按顺序执行
breakpoint command list 断点编号
breakpoint command delete 断点编号
内存断点
watchpoint set variable 变量
watchpoint set variable self->age
watchpoint set expression &(self->_age)
同理还有这些
watchpoint list
watchpoint disable 断点编号
watchpoint enable 断点编号
watchpoint delete 断点编号
watchpoint command add 断点编号
watchpoint command list 断点编号
watchpoint command delete 断点编号
image lookup
image lookup -t 类型 查找某个类型的信息(例如NSInteger)
image lookup -a 地址 根据内存地址查找在模块中的位置(开发中程序运行崩溃,可用这个定位在哪一行)
image lookup -n 符号或者函数名 查找某个符号或者函数位置
image list
image list -o -f 打印出模块的偏移地址、全路径
寄存器相关
dis -s -a 内存地址 查看内存 (disassemble --显示汇编代码 d di dis 等缩写都可以)
读取内存操作:
memory read/数量 _ 格式 _ 字节数 内存地址
或者
x/数量 _ 格式 _ 字节数 内存地址
格式
x :代表16进制
f :代表浮点数
d :代表10进制
字节大小
b :byte 代表1个字节
h :half word 代表2个字节
w :word 代表4个字节
g :giant word 代表8个字节
如:
memory read/1wx 0x7ffee14a5ba8
memory read/1wd 0x7ffee14a5ba8
用gdb查看内存
格式: x /nfu <addr>
说明
x 是 examine 的缩写
n表示要显示的内存单元的个数
f表示显示方式, 可取如下值
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节
po $x0:打印方法调用者
x/s $x1:打印方法名
po $x2:打印参数(以此类推,x3、x4也可能是参数)
如果是非arm64,寄存器就是r0、r1、r2
小技巧
敲Enter,会自动执行上次命令
绝大部分指令都可以使用缩写