一、汇编指令
跳转指令 ->函数的调用:
b/bl
return即函数的返回:
`ret`
注释:
;
调用符号,到上层即为调用函数或方法:
callq
二、LLDB常用命令
打印指令p/po(实际是expression的alias)
查询关于对象p的所有内存情况,注意⚠:iOS端为小端模式:
x p
打印对象或数据类型、结构体
:
p/expression -- # 打印基本数据类型、结构体
po/expression -0 -- # 打印对象(print object)
po this(self)/0x011d8001000081a5 # 打印对象
double浮点类型LLDB:
e -f(format) f(浮点类型) -- 0x4067d00000000000
或:
p/f 0x4067d00000000000
注意:有赋值就会有存储值,有存储值就可以po打印
直接用lldb进制换算
p/t # 打印成二进制格式
p/o # 打印成八进制格式
p/x # 打印成十六进制格式
p &_toolView # 打印地址
po [self.view recursiveDescription] # 打印视图层级结构
e/expr
expression [CATransaction flush] # 重新绘制界面,也可以用call
定义并打印一个对象
e NSArray *$array = @[@“one”,@“two”];
po $array
设置断点
给所有名为xx的函数设置一个断点:
breakpoint set —name
xxbr s -n xx
b xx
在文件F指定行L设置断点:
breakpoint set —file F —line L
br s -f F -l L
b F:L
当执行到该线程时,调试器才会断下来。一段代码可能开了多线程,要在不同线程之间切来切去。这时就可以使用线程断点了:
breakPoint set –f 文件名 –l 行号 –t 线程id
条件断点
breakpoint set -f viewController.m -l 362 -c "width > 68"
给所有名为xx的C++函数设置一个断点(希望没有同名的C函数):
breakpoint set —method xxx
br s -M xxx
给一个OC函数[objc msgSend:]设置一个断点:
breakpoint set —name "-[objc msgSend:]"
b -n "-[objc msgSend:]"
给所有名为xx的OC方法设置一个断点(希望没有名为xx的C或者C++函数):
breakpoint set —selector xx
br s -S count
给所有函数名正则匹配成功的函数设置一个断点:
breakpoint set --func-regex regular-expression
br s -r regular-expression
给指定函数地址func_addr的位置设置一个断点:
br set -a xxx
一次性断点:是命令选项结束符,如果没有选项,可以省略:
breakpoint set --one-shot true --name "-[objc msgSend:]"
断点列表
breakpoint list
br l
断点删除
breakpoint delete xxx
index指明断点的序号,如果为空则删除所有断点:
breakpoint delete xxx -f # 强制删除(不需要确认)
br del index
断点触发时自动执行下去
--auto-continue # 参数
thread
流程控制c n s f:
process continue/continue/c # 继续,到下一个断点
thread step-over/next/n # 步进,到下一行代码
thread step-in/step/s # 跳入所调用的函数
thread step-out/finish/f # 跳出所调用的函数
thread return # 立刻返回(用于隔离某个函数,伪造返回值)
thread select # 跳转到所选线程
thread info # 当前线程信息
thread list # 所有线程信息
thread jump
thread jump --by 1 # 跳到指定内存地址、或某一行
跳过一行代码,也可以拖动滑块(只能往后跳,不可回跳)。由于ARC下编译器实际插入了不少retain,release命令。跳过一些代码不执行很可能会造成对象内存混乱发生crash:
bt/thread backtrace
打印当前线程的堆栈信息(crash 发生的时候使用)
bt all # 打印所有线程的堆栈信息
三、寄存器相关指令
寄存器读取x0-x7(参数寄存器,用于将参数传递给函数并返回;函数返回值通过x0储存):
register read
register read x0
x/nuf
如x/4gx:16进制打印,4个格式化排版打印,内存单元以八字节用16进制显示
n表示要显示的存储单元的个数
u表示一个地址单元的长度
b表示单字节
h表示双字节
w表示四字节
g表示八字节
f表示显示方式:
x按16进制格式显示变量
d按10进制格式显示变量
u按10进制格式显示无符号整型
o按8进制格式显示变量
t按2进制格式显示变量
a按16进制格式显示变量
i指令地址格式
c按字符格式显示变量
待续!
有任何问题,欢迎👏各位评论指出!觉得博主写的还不错的麻烦点个赞喽👍