导语:使用lldb动态调试已经安装在手机上的App无法向自己做的项目那样在西xcode里随心所欲的调试,记录一些调试的用法,可以帮助我们动态调试没有源码安装到手机的项目。
调试breakpoint
-
可以使用help获取具体的用法
Help breakpoint
Help breakpoint set
-
给函数设置断点
breakpoint set -n 函数名
breakpoint set -n test
breakpoint set -n touchesBegan:withEvent:
breakpoint set -n "-[ViewController touchesBegan:withEvent:]"
breakpoint set -a 函数地址
breakpoint set -r 正则表达式
breakpoint set -s 动态库 -n 函数名
-
breakpoint list
: 列出断点(包括断点编号) -
breakpoint disable 断点编号
:禁用断点 -
breakpoint enable 断点编号
:启用断点 -
breakpoint delete 断点编号
:删除断点 -
breakpoint command
-
breakpoint command add 断点编号
给断点提前设置一些可执行的代码或命令,到了触发断点时,会按顺序执行
-
breakpoint command list 断点编号
查看某个断点已设置的代码或命令
-
breakpoint command delete 断点编号
删除断点设置的代码或者命令
-
调试express,call,print,p,po
-
其实express,call,print,p作用差不多,可以直接使用p
-
express -O -- XXX
与po
一样,类似于NSLog打印所以会使用 p、po就好了
(lldb) p array
(__NSArrayI *) $0 = 0x0000600000c86820 @"3 elements"
(lldb) po array //打印更详细
<__NSArrayI 0x600000c86820>(
dfas,
dfdaf,
dfadf
)
函数调用栈
命令
thread backtrace
简写bt
命令
thread return
,过掉当前方法后面的操作,直接结束当前方法
命令
frame variable
,打印当前栈帧的变量
命令
thread continue
、continue
程序继续运行,简写c
命令
thread step-over
、next
单步运行,遇到函数调用也一步跳过,简写n
命令
thread step-in
、step
单步运行,遇到函数调用进入函数,简写s
命令
thread step-out
、finish
直接执行完当前所有代码,返回上一个函数
- si(stepi)、ni(nexti) 与 s、n 类似
s、n 是源码级别调试命令
si、ni 是调试汇编用的命令
内存断点
-
在内存数据发生变化的时候触发的
-
watchpoint set variable
watchpoint set variable self->age
-
watchpoint set expression 地址
watchpoint set expression &(self->_age)
-
-
watchpoint list
-
watchpoint disable 断点编号
-
watchpoint enable 断点编号
-
watchpoint delete 断点编号
-
watchpoint command add 断点编号
-
watchpoint command list 断点编号
-
watchpoint command delete 断点编号
模块(镜像)查找
-
系统的动态库,App的可执行文件都是模块
-
image lookup
-
image lookup -t 类型
:查找某个类型的信息image lookup -t NSArray
-
image lookup -a 地址
:根据内存地址查找在某个模块的位置 -
image lookup -n 符号或者函数名
:查找某个符号或者函数的位置
-
-
image list
:列出所加载模块信息 -
Image list -o -f
:打印出模块的偏移地址、全路径
内存操作
-
register read 寄存器
:读取寄存器的值 -
register write 寄存器 值
:修改寄存器的值 -
读取对应内存地址的值
-
x/数量、格式、字节大小 内存地址
x/4xg 0x00001001
:表示根据地址读取4段内存数据,数据是16进制的,每段数据8个字节x 0x00001001
:一个字节一个字节读取内存数据 -
格式
x
16进制f
浮点d
10进制 -
字节大小
b
1字节h
2字节w
4字节g
8字节
-
-
memory write 内存地址 数值
:修改内存中的值
小技巧
- 按
Enter
键,会自动执行上次的命令 - 尽量使用命令缩写