ios arm64汇编调试

最近在看 ios 的 inline hook,免不了需要了解一下 arm64 汇编的知识,以及如何通过xcode去查看和调试汇编代码。

1、如果通过XCode查看汇编代码

在调用处添加断点,然后依次选择Xcode菜单中的 Debug->Debug Workflow->Always Show Disassembly命令后,就直接以汇编代码呈现了:
ios arm64汇编调试_第1张图片

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会显示所有变量,如下图所示:
ios arm64汇编调试_第2张图片
通过上图我们可以发现,lr寄存器会自动保存最后一次函数调用的返回地址。而PC保存着下一条将要执行的指令地址,因为调试的原因,断点处的地址就是PC寄存器的内容。

3、通过LLDB查看核心寄存器的内容

3.1 打印核心寄存器的值

打印核心寄存器值的命令是p/x $X29 表示打印FP寄存器的值,如下图所示:
ios arm64汇编调试_第3张图片
我们发现 X29寄存器确实就是FP寄存器,X30寄存器确实就是LR寄存器

3.2 读取所有寄存器的值

打印所有寄存器值的命令是register read,如下图所示:
ios arm64汇编调试_第4张图片

3.3 读取栈参数

读取栈参数,通过命令 memory read -f A $sp $fp

3.4 读取某个地址查看是什么函数

读取地址查看是什么函数,通过命令image lookup -a 6667518544,如下图所示:
ios arm64汇编调试_第5张图片

你可能感兴趣的:(ios,软件测试)