文章目录
- 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//正确,读取内存