开启Xcode汇编调试
选中Always Show Disassembly项。
XCode -> Debug -> Debug Workflow -> Always Show Disassembly
 
在计算机中,虽然数据是存储在内存中,但内存中数据的加减计算并不是在内存中直接进行的。
而是把内存中的数据赋值到寄存器中,然后CPU在寄存器中计算好后把结果再赋值到内存中的。
对内存中3做加1计算,并把几个4存储到蓝色内存块中
movq 红色存储空间, %rax addq $0x1, $rax movq %rax, 蓝色地址空间
汇编语言和机器语言是一一对应的。
汇编语言通过汇编器可以变成机器语言,机器语言通过反汇编又可以转成汇编语言。
高级语言通过编译器可以变成汇编语言,汇编语言无法通过反编译转成高级语言了。
 
汇编语言种类
8086汇编(16bit)
x86汇编(32bit)
x64汇编(64bit)
ARM汇编(嵌入式,移动设备)
对应iOS开发来说,iOS模拟器使用的AT&T汇编,iOS真机使用的ARM汇编。
 
OC和Swift调试的汇编指令是AT&T
它的数据移动操作顺序是从左往右,比如movq指令是将左边寄存器的值移动到右边的寄存器中。
数据的移动:
movq -0x18(%rbp) , %rax //表示将%rbp-0x18 这个内存地址中保存的值移到 %rax寄存器中
地址的移动:
leaq -0x18(%rbp) , %rax //表示将%rbp-0x18 这个地址移到 %rax寄存器中
call 内存地址 // 方法调用
jmp 内存地址 // if 跳转
addq $0x1, $rax // 赋值,把左边的值设置到右边的寄存器中
 
mov 与 movq相比多了一个q, 这个q是什么意思呢?
q代表保存数据要用多少个字节,q:64-bits, 8字节。
指令在内存中是顺序保存的,基本上每条指令占4字节。
 
call和jmp指令相似
call是方法调用,jmp是if判断。
call是和ret配合使用的 call 0x00是跳到这个函数地址,等函数执行完,走到ret后会回到call指令的下一句的。
jmp是顺序执行,jmp 0x00后一直顺序往下执行。
call和jmp跳一个动态的函数地址时,命令是call *的,如:call *%rax。
从寄存器的发展来看是由小到大,比如从x86的32字节,到x64的64字节,它们是怎么兼容的呢?
解决方法是共用一个64位寄存器的内存,按照所占内存大小,从低位往高位占据。比如32位寄存器只使用64位全部空间的一半,占据寄存器的低地址区。
%rip, %rdx, 以r开头的是64位8字节寄存器
%esi, %idx, 以e开头的是32位4字节寄存器
其他的
ax ,bx, cx 占2字节
ah, al 占1字节
 
lldb汇编调试指令
内存/寄存器读写
读取寄存器中的值
register read/格式
register read/x

修改寄存器中的值

register write 寄存器名称 数值
register write rax 0

读取内存中的值

x/数值-格式-字节大小 内存地址
x/3xw 0x000010

修改内存中的值

memory write 内存地址 数值
memory write 0x000010 10

汇编断点调试

thread step-inst-over, nexti, ni //单步运行,把子函数当做一个整体,一步执行
thread step-inst, stepi, si //单步运行,遇到子函数进入子函数
内存地址计算
当汇编调用,程序走到断点的位置时,要验证movq $0xa, 0x459d(%rip)这块汇编执行的效果时
会手动计算内存地址 = %rip + 0x459d
注意,此时从寄存器%rip拿到的值是错的,因为CPU的指令寄存器是保存的下一条指令要执行的地址
而当前断点断住了,相当于在CPU准备执行这个命令时会有一次执行下调指令的计算没有做,如果直接读取,那么读到的是还是CPU上一次的更新执行当前指令地址的值,正确的执行上下文时,应该是下一条指令的地址值。
%rip: 指令寄存器
iOS传参优先使用寄存器传参,寄存器不够了用栈传参。
内存地址格式规律
0x4bdc(%rip),一般是全局变量,全局区(数据段)
-0x78(%rbp), 一般是局部变量,栈空间
0x10(%rax), 一般是堆空间
常用寄存器
rax, rbx, rcx, rdx, rdi, rsi, rbp, rsp
r8,r9,r10,r11,r12,r13,r14,r15

rax 常用于函数返回值

rcx, rdx, rdi, rsi, r8, r9常用于存放函数参数。
rbp, rsp用于栈操作
rip作为指令指针(存放的是下一条执行指令的地址, 一旦CPU读取一条指令,rip自动指向下一条指令)
 
 

XCode汇编调试的更多相关文章

  1. GDB中汇编调试

    GDB中汇编调试 1.输入代码 2.使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,时遇到问题使用-m32指令报错,参考卢肖明同学博客知道这是 ...

  2. Xcode 7 调试野指针利器 Address sanitizer

    Xcode 7 调试野指针利器 Address sanitizer 什么是Address Sanitizer? AddressSanitizer is a fast memory error dete ...

  3. xcode的调试技巧

    转自:http://www.cnblogs.com/daiweilai/p/4421340.html#biyouji 目录 前言逼优鸡知己知彼 百战不殆抽刀断Bug 普通操作 全局断点(Global ...

  4. Xcode视图调试

    视图调试 使用视图调试器检查您的视图层次结构,可以轻松地判断视图位置.大小以及实现问题. 在XCode中运行你的应用程序,在调试栏上点击“调试视图层次”按钮,进入视图调试器. XCode停止你的应用程 ...

  5. GDB堆栈跟踪与汇编调试

    GDB堆栈跟踪与汇编调试 堆栈跟踪 源代码: 对预先编写的 stack.c 文件进行编译,并且使用 CGDB 进行调试,对堆栈进行跟踪,了解该代码堆栈是如何变化的. 在 CGDB 中,先设置 main ...

  6. 如何使用Xcode分析调试在真机运行的UE4 IOS版游戏

    写本文的是因为UE4 官方文档虽然也有,但主要讲的是是用UE4Editor把游戏打成一个IPA包的形式发布的方法 而对于想通过Xcode分析UE4的渲染流程来学习或优化的朋友,那官方文档的资料还是不够 ...

  7. xcode单步调试快捷键

    xcode单步调试快捷键f6,但是磨人f6是用来调节键盘亮度的,在系统偏好,键盘设置里面,做如下设置就可以了.

  8. iOS开发之Xcode常用调试技巧总结

    转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...

  9. 使用Xcode进行调试

    目录 知己知彼 百战不殆抽刀断Bug 普通操作 全局断点(Global BreakPoint) 条件断点(Condational Breakpoints)打印的艺术 NSLog 开启僵尸对象(Enab ...

  10. gdb汇编调试

    GDB调试汇编堆栈分析 代码: sudo apt-get install libc6-dev-i386命令安装所需库 进入之后先在main函数处设置一个断点,再run一下,使用disassemble指 ...

随机推荐

  1. Spring入门之使用 spring 的 IOC 解决程序耦合(Spring环境搭建)(03-01)

    3.1 案例的前期准备 1.使用的案例是:账户的业务层和持久层的依赖关系解决(就是有两个账户实现转账之类的事情,后期继续用这个案例)2.准备环境:在开始 spring 的配置之前,我们要先准备一下环境 ...

  2. GBDT中损失函数的负梯度用来拟合的一些理解

    将\(L(y_i,f(x_i))\)在\(f(x_i)=f_{m-1}(x_i)\)处泰勒展开到一阶(舍去余项,故为近似) \[L(y_i,f(x_i))\approx L(y_i,f_{m-1}(x ...

  3. 显式等待(一)WebDriverWait类、until()方法

    转自: https://blog.csdn.net/zyooooxie/article/details/84422924

  4. vue后台管理系统

    1. 项目概述: 根据不同的应用场景,电商系统一般都提供了 PC 端.移动 APP.移动 Web.微信小程序等多种终端访问方式. 2. 电商后台管理系统的功能 电商后台管理系统用于管理用户账号.商品分 ...

  5. 【编程】Python3 使用自定义编码字符表解密Base64数据

    前言 Python提供了"base64"模块用于编码.解码Base64数据.但是并不是所有的Base64数据都会使用默认的字符表进行编码,所以这里对Python下实现自定义编码字符 ...

  6. git 报错 incorrect username or password

    如果报这个 就是用户名 或密码错误 添加个正确的凭据就好了

  7. nuxt.js的生命周期

    nuxt的生命周期分为客户端生命周期,服务端生命周期 1.服务端的生命周期 执行顺序为:nuxtServerlnit(store,context){},  类似于vue.js中的main.js.可以在 ...

  8. ubuntu20安装open4.4带扩展库

    0查看当前版本安装 opencv_version 已经装了3.49 再装个4.4共存 1安装依赖库 sudo add-apt-repository "deb http://security. ...

  9. selenium webdriver 无法选中元素,修改元素属性可见

    <ul data-v-6529428e="" class="el-dropdown-menu el-popper filter-dropdown el-dropdo ...

  10. jsp+servlet+mysql

    前后端很容易因为编码的问题引起乱码  所以一定要搞清charset的几个值 charset=iso-8859-1 西欧的编码,英文编码 charset=gb2312 中文编码 charset=utf- ...