1. 命令格式、help
1.1 指令的格式
<command> [<subcommand> [<subcommand>. . .]] <action> [-options [option-value]]
[argument [argument... ] ]
- command : 命令
- subcommand : 子命令
- action : 命令操作
- options : 命令选项
- argument : 命令参数
- 比如给test函数设置断点
breakpoint set -n test
- breakpoint : 命令
- set : 子命令
-n
: 等价于--name
, 命令选项- test : 参数
1.2 help
- 查看指令的用法
- 比如
help breakpoint
、help breakpoint set
2. expression
- Syntax 语法
expression <cmd-options> -- <expr>
-
执行一个表达式
cmd-options
: 命令选项--
: 命令选项结束符,表示所有的命令选项已经设置完毕,如果没有命令选项,--
可以省略expr
: 需要执行的表达式
-
举例
expression self.view.backgroundColor = [UIColor redColor]
expression
、expression --
和指令print
、p
、call
的效果一样expression -O --
和指令po
的效果一样
-O
: --object-description
3. thread
3.1 thread backtrace
- 打印线程的堆栈信息
- 和指令
bt
的效果一样
- frame : 栈帧, 一个栈帧代表一个函数(方法)调用
- 栈帧会逆序调用, #17栈帧调用#16栈帧, 16栈帧调用15栈帧, 依次类推, 直到#0的test函数
3.2 thread return []
- 让函数直接返回某个值,不会执行断点后面的代码
- 如果是没有返回值, 直接使用
thread return
就可以了
3.3 frame variable
- 打印当前栈帧的变量
4. 操作控制
- thread continue、continue、 c :程序继续运行
- thread step-over、next、 n :单步运行,把子函数当做整体一步执行
- thread step-in、step、 s :单步运行,遇到子函数会进入子函数
- thread step-out、finish :直接执行完当前函数的所有代码,返回到上一个函数
5. 指令级别的命令
- thread step-inst-over、nexti、 ni
- thread step-inst、stepi、si
- si、ni和s、 n类似
- s、n是源码级别的单步执行
- Source level single step
- Source level single step
- si、ni是汇编指令级别的单步执行
- Instruction level single step
- Instruction level single step
- s、n是源码级别的单步执行
6. 代码断点
6.1 breakpoint set
-
设置断点
-
breakpoint set -a 函数地址
-
breakpoint set -n 函数名
breakpoint set -n test breakpoint set -n touchesBegan:withEvent: // 把所有的这样的方法都打上断点 breakpoint set -n "-[ViewController touchesBegan:withEvent:]" // 只把ViewController的方法打上断点
-
breakpoint set -r 正则表达式
-
breakpoint set -s 动态库 -n 函数名
6.2 breakpoint list
- 列出所有的断点(每个断点都有自己的编号)
6.3 断点相关操作
- breakpoint disable断点编号 : 禁用断点
- breakpoint enable断点编号 : 启用断点
- breakpoint delete断点编号 : 删除断点
7. 断点命令
7.1 breakpoint command add断点编号
- 给断点预先设置需要执行的命令,到触发断点时,就会按顺序执行
- 当程序运行到这的时候, 就会打印命令
7.2 breakpoint command list断点编号
- 查看某个断点设置的命令
7.3 breakpoint command delete断点编号
- 删除某个断点设置的命令
8. 内存断点
- 在内存数据发生改变的时候触发
- watchpoint set variable 变量
watchpoint set variable self->_age
- watchpoint set expression 地址
watchpoint set expression &(self->_age)
- 运行的时候就会触发内存断点
- 打印一下堆栈信息, 就可以看到在哪里修改的
- 打印堆栈信息:
thread backtrace
简写bt
- watchpoint list
- watchpoint disable 断点编号
- watchpoint enable 断点编号
- watchpoint delete 断点编号
- watchpoint command add 断点编号
- watchpoint command list 断点编号
- watchpoint command delete 断点编号
9. 模块查找
9.1 image lookup
image 在底层内存叫模块,不是图片
-
image lookup -t 类型:查找某个类型的信息
-
image lookup -a地址:根据内存地址查找在模块中的位置
- 根据报错信息找到对应的位置
- 根据报错信息找到对应的位置
-
根据地址查找,就能找到对应的代码
-
image lookup -n符号或者函数名:查找某个符号或者函数的位置
9.2 image list
- 列出所加载的模块信息
image list -o -f
- 打印出模块的偏移地址、全路径
10 小技巧
- 敲Enter, 会自动执行上次的命令
- 绝大部分指令都可以使用缩写