汇编指令和LLDB常用命令汇总

1,123 阅读4分钟

一、汇编指令

跳转指令 ->函数的调用:

b/bl   

return即函数的返回:

`ret`    

注释:

;

调用符号,到上层即为调用函数或方法:

callq

二、LLDB常用命令

打印指令p/po(实际是expression的alias)

查询关于对象p的所有内存情况,注意⚠:iOS端为小端模式:

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按字符格式显示变量

待续!
有任何问题,欢迎👏各位评论指出!觉得博主写的还不错的麻烦点个赞喽👍