以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
,解压缩、编译、报错 😆
底层的探索要不急不燥
依赖文件
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
错误:/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换个位置
网友评论