服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS Xcode汇编模式切换的方法介绍

iOS Xcode汇编模式切换的方法介绍

2021-04-28 17:13石虎132 IOS

这篇文章主要给大家介绍了关于iOS Xcode汇编模式切换的相关资料,文中通过图文介绍的非常非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、概念

 1.汇编指令 : 模拟器上运行的是intel指令,而真机上运行的是arm指令,

 2.每条汇编指令的格式总是由: 操作码, 操作数1,操作数2,操作数3组成。 操作数要么就是常数,要么就是寄存储器,要么就是内存地址。你所看到的操作数中的rax,rsi,rdi,r0,r1... 这些都是cpu中的寄存器(关于寄存器部分我将在下一篇文章中具体介绍)。而且在xcode的左下角部分我们可以查看当前cpu中的所有寄存器的值,你可以打印并修改他们。

  每个函数方法的第一个地址,就是这个函数的入口地址,也就是说我们进行函数调用时,实际上是让cpu跳转到这个地址并执行,更加具体的就是将ip/pc寄存器的值设置为这个函数的入口地址。 对于oc类中的方法来说方法入口地址其实就是这个方法的imp。

 3.断点 :也称中断

  一般情况下cpu总是按照顺序依次执行指令并完成任务,当正在执行某个任务时如果遇到了特殊事件或者更高优先级的任务时就需要打断现有执行的代码并去执行优先级更高的代码,这种机制就是中断。

 3.1 中断:分硬中断和软中断

       中断有因为外部硬件设备事件而产生的硬中断, 同时cpu也提供一个软中断指令。当在代码里面执行一条软终端指令时,程序就会暂停运行,同时cpu把操作权限提交给操作系统来执行中断处理程序。

 4.断点的实现原理

   当我们在程序某处设置了断点或者某个指令处设置断点时,系统会将断点处的指令保存到一个临时的断点列表中,同时将断点处的指令替换为软中断指令,这样当程序运行到断点处时因为执行的其实是软中断指令,而导致系统调用的发生,并执行软中断处理程序,软中断处理程序等待用户处理断点处的操作,比如当用户按下的是键盘上的ctrl + f7时,软中断处理程序就会把保存在临时断点列表中真实断点处的指令恢复到指定的内存,同时把下次要执行的指令改为真实的指令,然后再次执行真实的指令,这样就完成了断点处指令的继续执行。

 5.断点的理论

  调试寄存器(drx)的用处:

  1.设置发生断点的地址(线性地址)

  2.设置断点的长度(1,2,4个字节,但是执行断点只能是1)

  3.设置在调试异常产生的地址执行的操作

  4.设置断点是否可用

  5.在调试异常产生时,调试条件是否是可用

intel80386以上的cpu提供了调试寄存器以用于软件调试。386和486包括6个调试寄存器:dr0,dr1,dr2,dr3,dr6和dr7。这些寄存器全是32位,

 如下图所示:

iOS Xcode汇编模式切换的方法介绍

 只要能使用drx的断点功能就可以配合seh、调试api进行一些反跟踪等,具体怎么用,取决于你自己了。

m_le                         equ01shl08局部断点精确相符m_ge

equ m_le     shl01全局断点精确相符;drx accessm_gd

equ m_bd              drx保护位置一即使在ring0也产生int1

如图:

iOS Xcode汇编模式切换的方法介绍

总结: 调试断点是通过调试寄存器实现的。

二、汇编模式下命令

 1.你只需要在xcode的菜单:debug -> breakpoints -> create symbolic breakpoint 或者快捷键:option + command + \ 来建立符号断点:

图1:

iOS Xcode汇编模式切换的方法介绍

图2:

iOS Xcode汇编模式切换的方法介绍

 2.* 汇编模式下

  fn + control + f7 :  指令单步执行,当遇到函数调用时会跳入函数内部。

  fn + control + f6:   指令单独执行,当遇到函数调用时不会跳入函数内部。

 3.* 多线程之间的切换:

  control + shift + f7:  切换到当前线程,并执行单步指令。

  control  + shift + f6:  切换到当前线程,并跳转到函数调用的者的下一条指令。 

 4.* lldb命令行

expr   变量|表达式//显示变量或者表达式的值。

expr -f h --  变量|表达式 //以16进制格式显示变量或表达式的内容

expr -f b --  变量|表达式//以二进制格式显示变量或者表达式的内容。

expr -o --  oc对象 //等价于po  oc对象

   expr -p  3 -- oc对象//上面命令的加强版本,他还会显示出对象内数据成员的结构,具体的p后面的数字就是你要想显示的层次。

expr my_struct->a = my_array[3]//给my_struct的a成员赋值。

expr (char*)_cmd//显示某个oc方法的方法名。

expr (imp)[self methodforselector:_cmd]//执行某个方法调用.

图3:

iOS Xcode汇编模式切换的方法介绍

三、查看内存地址

 1.debug -> debug workflow -> view memory 或者通过快捷键:shift+command + m 来调用内存查看界面:

图4:

iOS Xcode汇编模式切换的方法介绍

图5:

iOS Xcode汇编模式切换的方法介绍

注意一点的是: 因为内存地址是从低位按字节依次排列而来,所以对于比如int类型的值的读取我们就要从高位到低位开始读取。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:https://www.jianshu.com/p/bdd0578f356d

延伸 · 阅读

精彩推荐
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25