OC 探索底层原理
以NSObject的alloc为列,我们只能跟到NSObject.h的头文件里
一般到这也就结束了,接下来介绍三种方法可以让我们继续往下探索和学习
符号断点
添加一个alloc的符号断点
我们可以看到
alloc 的源码在libobjc.A.dylib库中
使用Step into按钮+符号断点
Step into 按钮如图
长按
control点击Step into 按钮,点击三次
再添加符号断点
objc_alloc
汇编跟流程
xcode 工具栏 选择Debug --> Debug Workflow --> Always Show Disassembly,这个 选项表示 始终显示反汇编 ,即 通过汇编 跟流程
已经看到接下来要走
objc_alloc,再去添加符号断点就可以了
编译libobjc.A.dylib库
1、Apple 所有开源源码汇总地址,根据相应的版本查找对应的源码,以mac 10.15为例: macOS --> 10.15 --> 选择10.15 --> 搜索 objc
2、Apple 比较直接的源码下载地址,直接搜索想要下载的源码名称即可,例如objc:直接搜索 objc --> objc4/ --> 选择相应的objc的版本
我们这里下载 objc4-781.tar.gz,解压缩、编译、报错 😆
底层的探索要不急不燥
依赖文件
image.png
launchd-106.10 在Mac OS X 10.4.4中下载其它的在
Mac OS X 10.15中下载
错误:unable to find sdk 'macosx.internal'
解决方法
截屏2020-09-11 下午2.15.32.png
错误:'***.*' file not found
解决方法
- 在
objc4-781的根目录下新建Common文件 - 设置 header path,添加
$(SRCROOT)/Common
-
在Common文件中创建
sys文件
将xnu-6153.11.26/bsd/sys/reason.h文件拷贝到sys文件中 -
在Common文件中创建
mach-o文件
将dyld-733.6/include/mach-o/dyld_priv.h文件拷贝到mach-o文件中
打开dyld_priv.h,添加代码
#define DYLD_MACOSX_VERSION_10_11 0x000A0B00
#define DYLD_MACOSX_VERSION_10_12 0x000A0C00
#define DYLD_MACOSX_VERSION_10_13 0x000A0D00
#define DYLD_MACOSX_VERSION_10_14 0x000A0E00
- 在Common文件中创建
pthread文件
将libpthread-416.11.1/private/mach-o/tsd_private.h和spinlock_private.h文件拷贝到pthread文件中 - 在Common文件中创建
System文件,在System文件创建machine文件
下载pthread_machdep.h文件
将Libc-583/pthreads/pthread_machdep.h拷贝到System文件中
将xnu6153.11.26/osfmk/machine/cpu_capabilities.h文件拷贝到machine文件中 - 在Common文件中创建
os文件
将xnu6153.11.26/libsyscall/os/tsd.h文件拷贝到os文件中 - 下载Libc-825.24
将Libc-825.24/include/CrashReporterClient.h拷贝到Common文件中
添加LIBC_NO_LIBCRASHREPORTERCLIENT
修改Other Linker Flags,去掉CrashReporterClient
- 将
dyld-733.6/include/objc-shared-cache.h拷贝到Common文件中 - 将
libplatform-220/private/_simple.h拷贝到Common文件中 - 在Common文件中创建
kern文件
将xnu-6153.11.26/osfmk/kern/restartable.h拷贝到kern文件中 - 将
libclosure-74/Block_private.h拷贝到Common文件中
错误:can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/AppleInternal/OrderFiles/libobjc.order
解决方法
修改Order File 改为 $(SRCROOT)/libobjc.order
image.png
错误:/xcodebuild:1:1: SDK "macosx.internal" cannot be located.
解决方法
修改Run Script(markgc) 中的macosx.internal,改为macosx
接下来编译通过了 😭
调试libobjc.A.dylib库
- 新建一个 target
- 绑定
objc和libobjc.A.dylib
- 设置
Enable Hardened Runtime为No
4.如果遇到断点断不住的情况,把main.m换个位置