文章目录

  • 1.给函数设置断点 breakpoint
  • 2.调试指定动态库里的函数 br set -s
  • 3. 查看断点列表和序号: br list
  • 4. 删除断点 br delete
  • 5. 断点失效 br disable
  • 6. 断点生效 br enable
  • 7. 帮助 help
  • 8. 表达式 expression
  • 9.函数调用栈 thread backtrace
  • 10. 直接执行函数的返回 thread return
  • 10. 查看变量
  • 源代码级别的调试
  • 11.继续 thread continue 相当于xcode的F9
  • 10.单步入,如果有函数进入函数 s
  • 11.单步过,如果有函数不进入函数 n
  • 汇编指令级别的调试
  • 12.汇编代码 单步入si
  • 13.汇编代码单步过ni
  • 14.单步,直接返回到函数结束 finish
  • 15 给断点添加命令breakpoint command add
  • 16 查看断点列表
  • 17 添加内存断点通过变量名 watchpoint set variable 变量名
  • 18 添加内存断点,通过内存地址 watchpoint set expression 内存地址
  • 19.内存断点 watchpoint
  • 19.1 watchpoint enable 生效
  • 19.2 watchpoint disable 失效
  • 19.3 watchpoint delete 删除
  • 20.列出所有模块 image list
  • 21.查找一个类型 image lookup -t
  • 22.查找函数地址所在行数 image lookup -a 地址
  • 23.查找函数名所在位置image lookup -n 函数名
  • 24 .memory read 地址值 缩写 x,查看地址内存值
  • 25 读取寄存器 register read 寄存器名字
  • 26 写入寄存器 register write 寄存器名字 数值
  • 27 读取内存 memory read 缩写x
  • 28 $符号 加寄存器名字,可以直接操作寄存器


1.给函数设置断点 breakpoint

breakpoint set -n 函数名 缩写 br s -n

  • breakpoint 断点,缩写 br
  • set是设置
  • -n子命令 函数名字
  • 上面组合到一起就是给函数设置断点,通过函数名
    例如:br s -n test
    test是函数名,意思是给test函数设置断点
  • 如果设置特别长的方法,可以用双引号""引上
  • 例如下面swift方法:
    br set -n “ViewController.touchesBegan”
  • 下面是oc控制器ocVC的方法,注意因为名字太长,所以要用双引号引起来
    br set -n “-[ocVC touchesBegan:withEvent:]”

2.调试指定动态库里的函数 br set -s

br set -s 动态库名 匹配参数
br set -s libafc.tbd -r est

3. 查看断点列表和序号: br list

br list

4. 删除断点 br delete

br delete 断点序号(用breakpoint list查看序号)
例如:br delete 2

5. 断点失效 br disable

br disable 断点序号
br disable 1

6. 断点生效 br enable

br enable 断点序号
br enable 1
例如:

7. 帮助 help

help 命令
例如 help breakpoint
help breakpoint set

8. 表达式 expression

  • expression 缩写 ex

例如:
expr view.backgroundColor = UIColor.orange

  • expression 参数 – 对象 缩写 p
    代表 按照参数 显示后面的对象. --代表前面参数的结束
    例如
    ex -T – event
    代表 -T是代表显示后面event的类型. 空格–代表-T结束
  • expression -A – event
    -A代表显示所有子对象
  • 直接使用expr ,print, p , call 效果一样,都是打印出对象,或者执行表达式
    例如
    p view.backgroundColor = UIColor.orange
  • expression -O – 缩写 po
    对象,是想NSLog那样打印对象
    例如:expression -O – arr

9.函数调用栈 thread backtrace

thread backtrace 缩写是 bt (backtrace向后追踪)
frame #1代表函数调用的一帧,一帧是一个函数

10. 直接执行函数的返回 thread return

thread return
直接跳到函数结尾.跳过中间执行过程

10. 查看变量

frame variable
查看当前函数所有变量
frame variable 变量名 查看指定变量
例如:frame variable a

源代码级别的调试

11.继续 thread continue 相当于xcode的F9

thread continue 简称continue 或 c

10.单步入,如果有函数进入函数 s

thread step-in 简称 step 或者 s

11.单步过,如果有函数不进入函数 n

thread step-over 简称next 或者 n

汇编指令级别的调试

12.汇编代码 单步入si

thread step-ins 简称si

13.汇编代码单步过ni

thread step-inst-over 简称 ni

14.单步,直接返回到函数结束 finish

thread step-out 简称 finish

15 给断点添加命令breakpoint command add

breakpoint command add 序号,输入指令,直到输入大写的 DONE 结束. 执行到这个断点的时候自动执行下面命令
例如:

(lldb)breakpoint command add 2
> po self
> DONE
(lldb)

这样每次执行到断点2,都会打印self

16 查看断点列表

breakpoint command list 序号

17 添加内存断点通过变量名 watchpoint set variable 变量名

每次变量数值改变的时候会自动在改变变量值的地方停下
watchpoint set variable 变量名
例如:
watchpoint set variable self->_age

18 添加内存断点,通过内存地址 watchpoint set expression 内存地址

watchpoint set expression 内存地址
watchpoint set expression 0x0000000158d04984
watchpoint set expression &self->_age

19.内存断点 watchpoint

19.1 watchpoint enable 生效

19.2 watchpoint disable 失效

19.3 watchpoint delete 删除

20.列出所有模块 image list

21.查找一个类型 image lookup -t

image lookup -t
例如:
(lldb) image lookup -t ocVC

22.查找函数地址所在行数 image lookup -a 地址

image lookup -a 0x00000001027f415c
例如oc程序数组越界以后崩溃在main函数里,用这个指令找到 First throw call stack 函数调用栈里面 地址对应的函数所在文件地址

23.查找函数名所在位置image lookup -n 函数名

image lookup -n 函数名
image lookup -n test

24 .memory read 地址值 缩写 x,查看地址内存值

(lldb) x 0x000000016b3a4e88
0x16b3a4e88: 0a 00 00 00 01 00 00 00 00 c0 39 80 02 00 00 00  ..........9.....
0x16b3a4e98: 80 2a 6a 83 02 00 00 00 64 20 c4 cc 01 00 00 00  .*j.....d ......
(lldb) si

25 读取寄存器 register read 寄存器名字

缩写:
re re 寄存器名字
例如:

re re x0

如果不写寄存器名字,就列出全部寄存器例如

re re

26 写入寄存器 register write 寄存器名字 数值

缩写 re wr

register write x0 0x1111
re wr x0 0x2222

27 读取内存 memory read 缩写x

  • x是普通显示,按照字节显示
(lldb) re read sp
      sp = 0x000000016b9d0e60
(lldb) x 0x000000016b9d0e60
0x16b9d0e60: c0 e5 c3 82 02 00 00 00 00 c0 93 81 02 00 00 00  ................
0x16b9d0e70: 90 0e 9d 6b 01 00 00 00 98 0e 9d 6b 01 00 00 00  ...k.......k....
(lldb) x $sp
0x16b9d0e60: c0 e5 c3 82 02 00 00 00 00 c0 93 81 02 00 00 00  ................
0x16b9d0e70: 90 0e 9d 6b 01 00 00 00 98 0e 9d 6b 01 00 00 00  ...k.......k....
  • x/s 意思是以字符串形式显示
(lldb) x $x8
0x104d37600: 31 32 33 34 35 36 00 31 32 33 34 35 37 00 31 32  123456.123457.12
0x104d37610: 33 34 35 38 00 31 32 33 34 35 39 00 00 00 00 00  3458.123459.....
warning: Not all bytes (28/32) were able to be read from 0x104d37600.
(lldb) x/s $x8
0x104d37600: "123456"

28 $符号 加寄存器名字,可以直接操作寄存器

直接用打印寄存器的值不能

po x0//错误
po $x0//正确
x sp//错误
x $sp//正确,读取内存