LLDB 使用简单总结

290 阅读2分钟

终端使用LLDB:

  1. lldb + 可执行文件路径
  2. breakpoint set -n "[Person test4:]"
  3. 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

image.png 如果要调试前边或者后边的对栈 up: 去上一个对栈 这是 frame #1

image.png

image.png dowm: 下一个对栈

image.png frame select x : 选择x对栈 选择了对应的frame 这个时候寄存器信息是没有变化的,还是在frame #0 也就是当前断点处代码 image.png

堆栈回滚一般作用:

  1. 看是函数是谁调起的
  2. 看传递的是什么参数
  • 回滚以后修改方法参数,不会对结果有影响 比如: frame variable 打印: 方法调用者,方法名称,方法参数

image.png

thread return : 直接返回,不执行后边的代码,可以用来调试,绕过条件判断检测

内存断点

watchpoint [command] 类似ioskvo,当观察的对象值发生改变时触发断点

  1. variable 给变量设置内存断点 给对象pname属性设置内存断点 watchpoint set variable p->_name

image.png

  1. expression 给内存地址设置断点 比如给p->name 的内存地址下断点,先获取它的内存地址

watchpoint set expression 0xxxxxxxx(内存地址) 触发断点后可以bt查看调用栈,看是谁修改了值

image.png

break command add

在断点触发时执行的指令,比如:

  1. 下断点 (lldb) breakpoint set -n "-[ViewController touchesBegan:withEvent:]"
  2. 查看断点编号

截屏2022-02-28 下午9.13.38.png 3. break command add xxx(断点编号)

image.png 4. 实验 c继续执行过掉断点,然后点击屏幕触发断点,可以查看打印结果

image.png

target stop-hook

功能同break command add 一样,但是比他更加方便,不用查看断点编号

  • target stop-hook -o "frame variable"

只要断点触发就会执行frame variable 指令 还有一种更加方便的配置,在~/(user)目录下有一个.lldbinit文件,可以将想要执行的指令写入该文件,那么只要断点触发就会执行该指令,一劳永逸