终端使用LLDB:
- lldb + 可执行文件路径
- breakpoint set -n "[Person test4:]"
- run
breakpoint set -n "[Person test4:]"
help breakpoint : 查看 breakpoint 用法
help breakpoint set: 查看 breakpoint set用法
breakpoint set -r viewDidLoad
continue
继续执行 简写c
next
单步执行 将函数作为 一个整体一步执行 简写n
s
单步执行,遇到子函数会跳转到子函数中去bt
: 查看当前对栈 frame #0
如果要调试前边或者后边的对栈
up
: 去上一个对栈 这是 frame #1
dowm
: 下一个对栈
frame select x
: 选择x对栈
选择了对应的frame 这个时候寄存器信息是没有变化的,还是在frame #0 也就是当前断点处代码
堆栈回滚一般作用:
- 看是函数是谁调起的
- 看传递的是什么参数
- 回滚以后修改方法参数,不会对结果有影响
比如:
frame variable
打印: 方法调用者,方法名称,方法参数
thread return
: 直接返回,不执行后边的代码,可以用来调试,绕过条件判断检测
内存断点
watchpoint [command]
类似ios
的kvo
,当观察的对象值发生改变时触发断点
- variable 给变量设置内存断点
给对象
p
的name
属性设置内存断点 watchpoint set variable p->_name
- expression 给内存地址设置断点 比如给p->name 的内存地址下断点,先获取它的内存地址
watchpoint set expression 0xxxxxxxx(内存地址)
触发断点后可以bt
查看调用栈,看是谁修改了值
break command add
在断点触发时执行的指令,比如:
- 下断点
(lldb) breakpoint set -n "-[ViewController touchesBegan:withEvent:]"
- 查看断点编号
3. break command add xxx(断点编号)
4. 实验 c继续执行过掉断点,然后点击屏幕触发断点,可以查看打印结果
target stop-hook
功能同break command add
一样,但是比他更加方便,不用查看断点编号
target stop-hook -o "frame variable"
只要断点触发就会执行frame variable
指令
还有一种更加方便的配置,在~/(user)目录下有一个.lldbinit文件,可以将想要执行的指令写入该文件,那么只要断点触发就会执行该指令,一劳永逸