ios arm64汇编调试
最近在看 ios 的 inline hook,免不了需要了解一下 arm64 汇编的知识,以及如何通过xcode去查看和调试汇编代码。
1、如果通过XCode查看汇编代码
在调用处添加断点,然后依次选择Xcode菜单中的 Debug->Debug Workflow->Always Show Disassembly
命令后,就直接以汇编代码呈现了:
2、如何通过Xcode查看核心寄存器变量
ARM64有31个通用寄存器X0~X30
,每个寄存器可以存取一个64位的数据,除了X0~X30
寄存器外,还有一个SP
寄存器非常重要。下面介绍iOS工程中关注频率最高的一些寄存器。
- X0~X7:用来传递函数的参数,如果有更多的参数则使用栈来传递:X0也用来存放函数的返回值。
- SP(Stack Point):栈指针寄存器。指向栈的顶部。
- FP (Frame Pointer):即X29,帧指针寄存器。指向栈的底部。
- LR(Link Register):即X30,链接寄存器。存储着函数调用完成时的返回地址,用来做函数调用栈跟踪,程序在崩溃时能够将函数调用栈打印出来就是借助LR寄存器来实现的。
- PC(Program Counter):保存的是将要执行的下一条指令的内存地址。
而如何通过Xcode查看这些寄存器变量呢?在Xcode左下角选择All
会显示所有变量,如下图所示:
通过上图我们可以发现,lr
寄存器会自动保存最后一次函数调用的返回地址。而PC保存着下一条将要执行的指令地址,因为调试的原因,断点处的地址就是PC寄存器的内容。
3、通过LLDB查看核心寄存器的内容
3.1 打印核心寄存器的值
打印核心寄存器值的命令是p/x $X29
表示打印FP寄存器的值,如下图所示:
我们发现 X29
寄存器确实就是FP
寄存器,X30
寄存器确实就是LR
寄存器
3.2 读取所有寄存器的值
打印所有寄存器值的命令是register read
,如下图所示:
3.3 读取栈参数
读取栈参数,通过命令 memory read -f A $sp $fp