首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

swift底层探索 03 - 值类型、引用类型swift底层探索 03 - 值类型、引用类型

每一个界限都是一个人为划分和规定的。 通过lldb观察struct、class ? ? struct和class初始化之后的内存布局不相同,struct直接存放值,class存放指针。...struct的内容直接存放在栈区, class中存放着的指向堆区的指针(猜测),堆区又指针指向的才是class的内容 xcode - Cat address 内存地址属于哪片区域,除了猜测还是有工具可以查看的...观察一下结构体的sil文件 swift底层探索 02 - 属性一文中对sil文件的获取和使用做了解释,有兴趣可以去看看。 初始化方法 ?...类的初始化 观察到了堆内存的申请(alloc_ref),以及类应用到堆空间的apply方法. [总结] 引用类型地址中存在的是指针地址而不是值....如果理解不了,可以参考OC中的NSString声明需要使用copy关键字。 lldb验证 ? 通过lldb更加直观的看到a的内存布局. ? 通过lldb更加直观的看到aa的内存布局.

84330

汇编和栈

现在该通过深入研究一些 “与堆栈相关的” 寄存器以及堆栈中的内容,来深入探讨从程序集角度调用函数时的情况。...之所以能这样是因为 RBP 在函数序言中的函数开始处被设置为 RSP 寄存器的值。 有趣的是,基本指针的之前内容在被设置为 RSP 寄存器的值之前就已存储在栈中。这是函数序言中发生的第一件事。...当一个函数序言完成设置时,RBP 的内容将指向堆栈帧下面的前一个 RBP 注意:当您通过单击 Xcode 中的帧或使用 LLDB 跳到另一个堆栈帧时,RBP 和 RSP 寄存器都将更改值以对应于新的帧!...为了解决这个问题,在 LLDB 中输入以下内容 (lldb) command alias dumpreg register read rsp rbp rdi rdx 这将创建命令 dumpreg,它将...在 LLDB 中,键入以下内容: (lldb) si 这个命令是单步调试的命令,它告诉 LLDB 执行下一条指令,然后暂停调试器。 现在,您已进入 StackWalkthrough。

3.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    KVO的实现原理

    然后在添加观察前下个断点。 通过lldb调试可以看到,在执行addObserver方法之前,p对象Class类型为LGPerson。...通过打印信息我们可以发现addObserve的时候,self.p的isa指针指向了 NSKVONotifying_LGPerson,在removeObserver之后,self.p的isa指针又指回了...在26行代码处lldb输入watchpoint set variable self->_p->_name。 watchpoint set variable观察某个值是否修改 然后过掉26行代码断点。...但是需要注意一点:willChangeValueForKey和didChangeValueForKey一定要成对出现。 那observeValueForKeyPath是什么时候调用的呢?...总结 所以,KVO的实现原理为:在我们调用addObserve的时候,会动态生成一个以NSKVONotifying_开头的当前类的一个子类,对象的isa指针就会指向这个类,系统会自动生成相应的方法。

    1.3K40

    XCode LLDB调试小技巧基础篇提高篇汇编篇

    也可以按组删除,直接输入组号就可以 (lldb) br delete 6 1 breakpoints deleted; 0 breakpoint locations disabled. 4.设置观察点...我们有时候想知道某个变量是否发生改变了,可以通过设置观察点的方式监控 (lldb) watchpoint set var self->_testA Watchpoint created: Watchpoint...x $rdi($rdi在x64模拟器上是第一个寄存器,也就是指向OC方法中的Self) (lldb) p/x $rdi (unsigned long) $1 = 0x0000600000005750 现在我们拿到...更加详细的说明可以看这里 一些常用的组合: x/16xb self 会显示 self 指针地址内容,16 个字节,16 进制。...输出查看的时候有一点要注意,arm是小端存储,低地址存放的是低位~ PS:有时候Crash的时候输出下x/16a $rsp,会看到一些额外信息~

    4.8K80

    OC底层探索06-isa本身藏了多少信息你知道吗?OC底层探索06-isa本身藏了多少信息你知道吗?

    isa指针 在OC底层探索03一文中的alloc创建步骤3initInstanceIsa中提到了isa值的创建。通过查看iSA值的创建过程找到我们想要的答案。...isa指针信息的LLDB验证 ? 0x001d8001000033bd这个值就是isa。但是需要特别注意的是这个值并不是指针地址,它就是一个十六进制的值。这个点对本文的理解很重要。...lldb调试的一些常用命令 p 输出基本类型 p/t 输出二进制 p/x 输出十六进制 po 调用基本的description方法 x 打印十六进制地址 x/4gx 将十六进制分组方便观察,...(这个是通过多次试验得出,如果有问题或者知道如何验证,希望不吝赐教)需要注意isa结构中类的信息是从第4位开始的,只要将isa的后3位改为0就可以直接得到类信息,所以在保存的时候需要将类指针进行位移(uintptr_t...验证方法一 根据对ISA_BITFIELD的观察,shiftcls前有3位,后有17位。将这些位置都置为0,就可以得到isa中类的信息 ?

    36630

    iOS——调试工具LLDB学习

    在日常的开发和调试过程中给开发人员带来了非常多的帮助。了解并熟练掌握LLDB的使用是非常有必要的。这篇文章将会带着大家一起了解在iOS开发中LLDB调试器的使用。...的简写 po:OC里所有的对象都是用指针表示的,所以一般打印的时候,打印出来的是对象的指针,而不是对象本身。...如果仔细观察,这些frame和左边红框里的堆栈是一致的。平时我们看到的左边的堆栈就是frame。 ?...但是如果更改的时候没调用setter方法呢? 这时候最好的办法就是用watchpoint。我们可以用他观察这个属性的地址。...只要这个地址中的内容变化了,程序就会中断。 watchpoint set variable:一般情况下,要观察变量或者属性,使用watchpoint set variable命令即可。

    1K21

    rust-vim 整合基于vimspector的debug调试环境

    /install_gadget.py --enable-rust'} 在vim中执行: :PlugInstall 添加配置到init.vim中 ~/.config/nvim/init.vim "=...1.添加 lldb-vscode.json lldb-vscode.json文件所以在这个路径,如果没有.gadgets.d需要创建一个,我的 路径: ~/.vim/plugged/vimspector.../gadgets/macos/.gadgets.d/lldb-vscode.json 这里说明一个,这个路径是.vim,我用的是nvim没错,只是我把插件路径都统一到了.vim这个目录下了。...F9 VimspectorToggleBreakpoint 添加、取消断点 F9 VimspectorToggleConditionalBreakpoint 添加条件断点或日志点...还有就是各个窗口,也和IDE差不多的功能,线程栈可以跳对应的线程和执行的代码位置。 变量监视窗口支持表达式,到窗口按i,就可以输入表达式如:i==50。 差不多就能用了,有问题留言。

    55420

    【iOS底层】 类的结构分析

    这里要注意的是,在new版本的源码中,objc_class继承自objc_object,在之前的旧版本中,isa指针直接定义在objc_class中,其中OC中的NSObject在编译到底层的时候都会转变成相应的结构体...,但是除了第一以及第二的内存,是我们熟悉的isa以及superClass指针以外,第三块地址的内容我们完全不知晓,第四块地址直接就不存在 按照Class结构体的成员定义顺序,以及内存对齐原则,我们尝试用指针偏移的方法...,结合class_rw_t里的方法名称,可以先尝试探索一下ro部分 先p出ro的地址,得出一个class_ro_t类型的结构体指针,我们直接取值,拿到class_ro_t结构体的内容,从中可以找到ivars...) (滑动显示更多) 继续寻找ivar的值,打印得到ivar_list_t类型的指针,依旧取值,输出内容,发现了我们定义的成员变量hobby (lldb) p $5.ivars (const ivar_list_t...isa指针的走向,了解到了类的isa指针,指向的是一个同名类,我们把它叫做元类,那么类方法会不会保存在元类中,我们测试一下 lldb控制台输入命令 x/4gx pClass之后,先通过isa指针查找到

    34310

    iOS各种调试技巧豪华套餐

    当然也还可以监视某个变量! 图5 ? 在对象视图中,右键某个对象,点击“Watch ‘XXX’”就完成XXX对象的监视了。...我们家的编译器历史 敬请乱入 《iOS中的预编译指令的初步探究》 ,没错我们现在正在使用着世界上最好的c、c++、oc、swift的编译器——LLVM,lldb就是这个世界上最好的LLVM的调试器!...使用Swift的属性观察者功能,在数据源发生改变时,表视图会自动重新加载。通过查看以上代码片段,你会发现应该应用中应该有4个项目需要展示,但现在不展示数据就说明某些地方出现了差错。...在Xcode的调试区有9个视图调试过程中要用到的按钮和滑块儿。 图30 ? 从左到右控件排序: 调整视图间距:调整不同视图间的间距。 展示被剪切的内容:当前展示视图中被剪切的部分。...展示约束:展示选中视图的约束。 重置查看区域:将3D渲染透视图恢复至默认状态。 调整查看模式:选择性地展示3D渲染透视图,比如仅展示内容,仅展示框架以及同时展示内容和框架。

    1.4K20

    LLDB结合底层源码分析Cache数据结构

    就很明显了,__LP64__ 就是指代 Unix 系列的操作系统,所以都是跑的64位,也就是说,这个 if 条件是成立的。...所以,我来看看他里面有没有我想要的东西,点进去,看到了两个 sel(),都是由 bucket_t 对象中的元素进行调用,也就是对 bucktet_t 进行了一些操作,难道关键就在bucket_t ?...感觉他的重心应该就是这个bucket_t,我直接点进去,看到如下图的内容。...这是LLDB调试遇到问题的时候最常见的办法,那我去 cache_t 结构体中找一下是不是有get相关的方法,别说,还真有。...这个条件语句里面,我是走的 if 还是 else 呢,我都不用分析这个条件,对比一下打印出来的 $4 就知道了,先 imp,然后 sel,所以走的是 __arm64__,大多数人在这里应该都是走的 else

    34910

    OC底层探索09-cache_t实现原理探索OC底层探索09-cache_t实现原理探索

    *) $5 = 0x0000000101334620 //bucketb第一个元素 (lldb) p *$5 //指针取地址 (bucket_t) $6 = { _sel = { //列表第一个元素的...方法在系统中是进行过处理的,无法直接访问变量指针地址获取值。...所以会丢弃一部分内容。 以下是cache原理分析的流程图 ?...装载因子越大,说明空闲的位置越少,冲突的可能性越多,散列表的性能会下降。尽可能小的装载因子可以提高散列表的性能,同时太小的值又容易触发扩容条件,所以这里苹果设计了这样一个的适当的值。...,所以occupied无脑设为0 不是64位真机,正常存储bucket和mask 64位真机,buckets和mask要存入一个指针中。

    40820

    iOS各种调试技巧豪华套餐

    当然也还可以监视某个变量! 图5 ? 在对象视图中,右键某个对象,点击“Watch ‘XXX’”就完成XXX对象的监视了。...我们家的编译器历史 敬请乱入 《iOS中的预编译指令的初步探究》 ,没错我们现在正在使用着世界上最好的c、c++、oc、swift的编译器——LLVM,lldb就是这个世界上最好的LLVM的调试器!...使用Swift的属性观察者功能,在数据源发生改变时,表视图会自动重新加载。通过查看以上代码片段,你会发现应该应用中应该有4个项目需要展示,但现在不展示数据就说明某些地方出现了差错。...在Xcode的调试区有9个视图调试过程中要用到的按钮和滑块儿。 图30 ? 从左到右控件排序: 调整视图间距:调整不同视图间的间距。 展示被剪切的内容:当前展示视图中被剪切的部分。...展示约束:展示选中视图的约束。 重置查看区域:将3D渲染透视图恢复至默认状态。 调整查看模式:选择性地展示3D渲染透视图,比如仅展示内容,仅展示框架以及同时展示内容和框架。

    1.9K90

    汇编和内存

    第二行告诉 LLDB 不要跳过函数序言。 您在本书的前面已经了解了这一点,从现在开始,请不要跳过序言,因为您将直接从函数的第一条指令检查汇编。...# 内存中断 现在,您已经了解了指令指针,是时候进一步探索其背后的内存了。顾名思义,指令指针实际上是一个指针。它不执行 RIP 寄存器中存储的指令,而是执行 RIP 寄存器中指向的指令。...在 LLDB 中看到这一点也许会更好地描述它。返回 Registers 应用程序中,打开 AppDelegate.swift 并再次在 aBadMethod 上设置一个断点。生成并运行该应用程序。...在 LLDB 控制台中,键入以下内容: cpx $rip 到现在为止,这将打印出指令指针寄存器的内容。如预期的那样,您将获得 aBadMethod 起始地址。...但是同样,RIP 寄存器指向内存中的值。 它指的是什么? 嗯,您可以摆脱疯狂的 C 编码技巧(您还记得吗?)并取消引用指针,但是使用 LLDB 可以找到一种更为优雅的方法。

    1.2K20

    教你 Debug 的正确姿势——记一次 CoreMotion 的 Crash

    一般 PC 寄存器保存的是下一条指令的地址,并且要求地址最后的两个比特位是 00 ,这个地址很明显不能满足要求;这种情况通常是因为数据被破坏,导致读取到的函数指针值异常。...这个上报上来的 crash 是发生在安装了 iOS 10.3.1 (14E304 的一台 64 位机器上,所以我们找来一台符合这两个条件的设备;因为这是发生在系统框架里面,满足这两个条件才能保证 CoreMotion...的二进制内容和 crash 的机器是一致的(可以通过 framework 的 UUID 来验证这一点)。...总结 林子大了什么鸟都有,一个大型的应用总会遇到各种奇葩的 BUG,具体解决的手段可能各有不同,但是有一个 科学方法 很值得参考,通过观察收集一个 crash 上报的细节信息,然后提出假设,验证假设;这个过程中辅助以各种工具和经验...---- 如果您觉得我们的内容还不错,就请转发到朋友圈,和小伙伴一起分享吧~

    2.9K71

    ios 底层原理 : 类与类结构分析

    %@ %@",person,teacher); } return 0; } 元类 首先我们通过案例的 lldb 引出元类 在 main 中的 LGTeacher 处加一个断点,运行...0x0000000100008568地址是类中的 isa 的指针地址,是 LGPerson 类的类的指针地址,我们把 LGPerson 类的类称为元类 所以打印为 LGPerson的根本原因就是元类导致的...与对象的关系是继承关系 总结 所有对象,类,元类都有 isa 属性 所有对象都是由 objc_object 继承来的 概括:万物皆对象,万物皆来自于 objc_object,有以下两点结论 所有以...png 类结构分析 主要分析类信息中主要存储哪些内容 补充知识:内存偏移 在分析类结构之前,需要了解内存偏移,因为类信息访问时,需要用到内存偏移 [普通指针] int a = 10;...可以通过首地址加偏移量,取出数组中其他元素,其中偏移量是数组的下标,内存中的首地址实际移动的字节数,等于偏移量*数据类型字节数 未命名文件.png 探索类信息中有哪些内容

    63120

    OC对象原理(二)

    因此,【③】中第13行if (fastpath(cls->canAllocFast()))条件永远不会走,只会走else中的第23~25行: 编译期,alloc方法流程分析 上面的分析只是alloc...isa联合体中,类结构的绑定 上面我们有提到,在nonpointer的isa指针中,会有一个shiftcls来存储类指针,即绑定对应类的地址。...因此我们得出结论,对象中的第一个属性必然是isa指针,并且isa指针指向的就是该对象所对应的类的内存地址。...接下来进行验证: 第一步,我使用x/4gx tank来打印了实例对象tank的内存地址,第一段地址就是isa存储的内容,即对应类的地址: (lldb) x/4gx tank 0x600003b64270...po 0x0000000106b5eec8 NormanTank 第二步,打印对应类的内存,第一段地址就是isa存储的内容,即对应元类的地址: (lldb) x/4gx 0x0000000106b5eec8

    73710

    Visual Studio 在中断模式下检查和修改数据

    图 6 使用跟踪点观察变量值的变化 有个这个跟踪点,你就不必不断地中断程序。在一次性执行完成清单 1中的for之后,“输出”窗口中就会显示如清单 2所示的结果。...从图 7中我们只能看到数组第一个元素的值。 ? 图 7 指针p的内容 非常明显,图 7不是我们想看到的结果。那么,该怎么办呢?...图 8指针p所指数组的内容 如果直接“局部变量”窗口、“自动” 窗口、“监视”窗口或“快速监视”对话框来查看p,Visual Studio会显示类似于图 7的内容。...从图 7中我们只能看到数组第一个元素的值。 ? 图 7 指针p的内容 非常明显,图 7不是我们想看到的结果。那么,该怎么办呢?...图 8指针p所指数组的内容 如果您想要查看数组中的某个元素,例如第6个元素,那么只需要输入“p[5]”。

    1.8K30

    iOS逆向之lldb常用操作指令

    介绍lldb之前,我们先补充一下上一篇iOS逆向之lldb调试分析CrackMe1讲的分析CrackMe1过程中如何从一开始打开app定位到buttonClick函数,然后再介绍lldb常用操作指令。...一、定位CrackMe1的buttonClick函数 分析一款新应用,条件允许的话一般都是先安装到相应设备中打开把玩一遍,记录不同操作获得的信息提示、内容展示或者发送的网络请求,为定位到相应的功能模块提供定位信息...lldb调试app流程中的各个步骤: 其中整个流程包括确定函数在哪个模块(确定函数在进程中的地址);在函数位置下好断点(确定完地址后,则需要下断点,当进程恢复运行后,运行到断点处会停下);开始启动程序;...)p x0打印出寄存器中存储的值的类型及数据如下图所示po x0以object的形式打印出寄存器存储的值,查看object类型的一般使用这个,比如字符串如下图所示p/x sp以16进制的形式打印栈顶指针...-f A sp fp也可以使用上面指令读取从栈顶指针开始的内存中的值如下图所示bt查看程序调用的堆栈信息,即有时候需要确定该函数的上层调用函数,可通过堆栈信息找到如下图所示 register write

    1.7K30

    iOS逆向工程之Hopper+LLDB调试第三方App

    LLDB是Low Level Debugger的简称,在iOS开发的调试中LLDB是经常使用的,LLDB是Xcode内置的动态调试工具。...当然,有一点需要注意的是Hopper与LLDB所选择的AMR架构的位数得一致,要么是32位,要么都是64位,如果位数不匹配的话,那么计算出来的内存地址肯定是不对的。...我们还可以将一个地址所存放的值进行打印,下方这个命令就是输出了$sp指针所指的地址处所存放的值: p/x $sp ?...接下来我们要做的事情就是,在比较寄存器r0和r1中的值时我们要改变r1寄存器中的值,然后观察App的运行效果。下方这个截图是随便输入手机号和密码时所提示的内容。也就是正常的流程会弹出下方的框。 ?...本篇博客的内容就到这儿吧,至此,你应该能将LLDB与Hopper结合起来使用了吧。今天我们以“微信”为例子,并没有别的意思,只是想在真正的实例中实现一下。

    2.3K90
    领券