1、alloc分析、源码调试(1)

1、基于断点的底层探索()

定义一个Person类:
person类

:点击进入alloc方法的定义,找到

+ (instancetype)alloc OBJC_SWIFT_UNAVAILABLE("use object initializers instead");

之后无法进一步追溯。

:符号断点alloc方法,汇编代码分析。

注:app启动预先会调用很多alloc方法,最好在Person类的alloc之前都disable符号断点,得到如下:
_objc_rootAlloc方法

继续符号断点搜索_objc_rootAlloc得到:
跳转_objc_rootAllocWithZone,所属libobjc.A.dylib
继续符号断点搜索_objc_rootAllocWithZone得到
calloc方法,所属 libsystem_malloc.dylib
继续符号断点搜索calloc
malloc_zone_calloc方法,所属libsystem_malloc.dylib

得到malloc_zone_calloc方法,如果继续用符号断点进行跟进会发现没有明显的alloc的标示,无法进一步分析,这时候就需要源码分析了。

2、objc4源码环境配置

源码路径地址:https://opensource.apple.com/ 下载地址:https://opensource.apple.com/tarballs
可以在iOS最新版本中web界面搜索objc找到如下:(这里为什么搜索objc,主要之前是基于libobjc.A.dylib,同样也可以搜索malloc,基于libsystem_malloc.dylib)

objc4-781源码
打开工程,新建一个command tools的target,设置库的引用和定义的person类
库和引用
main方法
然后运行,会发现报错, 问题,将objc和objc-trampolines两个target中的build setting->Base SDK 改为macos最新版本。

然后运行,会发现报错 找不到头文件,这里参考了Style_月月同学文章 https://www.jianshu.com/p/2fae148f015f,添加相应的缺失文件。这里我补充一下我遇到的两个个文件补充完后仍存在的文章未提到的问题:
1、文件方法中存在一个方法,宏定义报错。

uint32_topts = OS_UNFAIR_LOCK_DATA_SYNCHRONIZATION | OS_UNFAIR_LOCK_ADAPTIVE_SPIN; 

由于没有这个定义所以报错,这里将后面这个选项删除。
2、文件中,方法报错。
在 添加,debug和release都加入。

这样就可以继续调试了


你可能感兴趣的:(1、alloc分析、源码调试(1))