- 本文主要是通过将
objc4-781
的源码编译成功,然后在源码中新建一个YYTest的Target,然后将其与objc4-781工程源码进行绑定,最后运行YYTest进行底层源码的调试;
工具环境
- Xcode Version 11.3.1
- MacOS 10.15.3 (19D76)
- objc4-781源码
objc4-781源码运行所需要的依赖文件
编译objc4-781源码工程所遇到的问题及解决方案
问题一: unable to find sdk 'macosx.internal
- 解决方案:选择
target -> objc -> Build Settings -> Base SDK -> 选择 macOS
【target中的 objc 和 obc-trampolines都需要更改】
问题二: 'sys/reason.h' file not found
- 解决方案: 在objc4-781的根目录下新建YYCommon文件夹, 同时在YYCommon文件中创建sys文件夹;
将依赖文件xnu-6153.11.26下的reason.h(路径为:
xnu-6153.11.26/bsd/sys/reason.h
)拷贝到新建YYCommon/sys文件夹中;-
设置文件检索路径:选择
target -> objc -> Build Settings
,在工程的 Header Serach Paths 中添加搜索路径$(SRCROOT)/YYCommon
问题三: mach-o/dyld_priv.h' file not found
- 解决方案:在objc4-781的根目录下的YYCommon文件夹下新建mach-o文件夹;
- 将依赖文件dyld-733.6下的dyld_priv.h(路径为:
dyld-733.6/include/mach-o/dyld_priv.h
)拷贝到新建YYCommon/mach-o文件夹中; - 拷贝到文件后,还需要修改 dyld_priv.h 文件,即在 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
- 修改后的dyld_priv.h文件;
- 若dyld_priv.h文件出现
bridgeos(3.0)
报错,则将参数bridgeos(3.0)去除,去除之后如下所示;
问题四: os/lock_private.h' file not found
- 解决方案:在objc4-781的根目录下的YYCommon文件夹下新建os文件夹;
- 将依赖文件libplatform-220下的lock_private.h和base_private.h(路径为:
libplatform-220/private/os/lock_private.h,base_private.h
)拷贝到新建YYCommon/os文件夹中;
问题五: 'pthread/tsd_private.h' file not found
- 解决方案:在objc4-781的根目录下的YYCommon文件夹下新建pthread文件夹;
- 将依赖文件
libpthread-416.11.1
下的tsd_private.h
和spinlock_private.h
(路径为:libpthread-416.11.1/private/tsd_private.h,spinlock_private.h
)拷贝到新建YYCommon/pthread文件夹中;
问题六: System/machine/cpu_capabilities.h' file not found
- 解决方案: 在objc4-781的根目录下的YYCommon文件夹下新建System/machine文件夹;
- 将依赖文件
xnu6153.11.26
下的cpu_capabilities.h
(路径为:xnu6153.11.26/osfmk/machine/cpu_capabilities.h
)拷贝到新建YYCommon/System/machine文件夹中;
问题七: 'os/tsd.h' file not found
- 解决方案:将依赖文件
xnu6153.11.26
下的tsd.h
(路径为:xnu6153.11.26/libsyscall/os/tsd.h
)拷贝到新建YYCommon/os文件夹中;
问题八: 'System/pthread_machdep.h' file not found
- 解决方案: 将依赖文件
Libc-583
下的pthread_machdep.h
(路径为:Libc-583/pthreads/pthread_machdep.h
)拷贝到新建YYCommon/System文件夹中;
问题九: 'CrashReporterClient.h' file not found
- 解决方案:将依赖文件
Libc-825.24
下的CrashReporterClient.h
(路径为:Libc-825.24/include/CrashReporterClient.h
)拷贝到新建YYCommon文件夹中; - 工程配置在
Build Settings -> Preprocessor Macros
中加入:
LIBC_NO_LIBCRASHREPORTERCLIENT
- 如果还是报错CrashReporterClient 的问题,解决方法: 在
BuildSetting --> Other Linker Flags
中去掉CrashReporterClient
;
问题十: 'objc-shared-cache.h' file not found
- 解决方案:将依赖文件
dyld-733.6
下的objc-shared-cache.h
(路径为:dyld-733.6/include/objc-shared-cache.h
)拷贝到新建YYCommon文件夹中;
问题十一: 'kern/restartable.h' file not found
- 解决方案:在objc4-781的根目录下的YYCommon文件夹下新建kern文件夹;
- 将依赖文件
xnu6153.11.26
下的restartable.h
(路径为:xnu6153.11.26/osfmk/kern/restartable.h
)拷贝到新建YYCommon/kern文件夹中;
问题十二: Mismatch in debug-ness macros
- 解决方案:注释掉objc-runtime.mm中的#error mismatch in debug-ness macros;
问题十三: '_simple.h' file not found
- 解决方案:将依赖文件
libplatform-220
下的_simple.h
(路径为:libplatform-220/include/_simple.h
)拷贝到新建YYCommon文件夹中;
问题十四: ''Block_private.h' file not found
- 解决方案:将依赖文件
libclosure-74
下的Block_private.h
(路径为:libclosure-74/Block_private.h
)拷贝到新建YYCommon文件夹中;
问题十五: 'can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/AppleInternal/OrderFiles/libobjc.order
- 解决方案:在工程中配置:
target -> objc -> Build Settings -> Order File
中添加路径$(SRCROOT)/libobjc.order
问题十六: library not found for -lCrashReporterClient
- 解决方案:在工程中配置:
target -> objc -> Build Settings -> Other Linker Flags
Debug与Release模式下的Any macOS SDK 找到lCrashReporterClient删除掉;
问题十七: /xcodebuild:1:1: SDK "macosx.internal" cannot be located
解决方案:
- 在工程中配置:
targets -> Build Phases -> Run Script
中的macosx.internal改成macosx
- 上面的所有问题解决完,objc4-781源码工程就能编译成功了,完整的工程文件如下:
在objc4-781源码工程中新建Target 命名为YYTest,然后配置最后可以进行源码调试了;
- 新建Target 命名为YYTest;
YYTest的工程配置
1.给YYTest绑定依赖关系,
YYTest -> Build Phases -> Dependencies
添加objc
-
2.给YYTest添加库,
YYTest -> Build Phases -> Link Binary With Libraries
添加libobjc.A.dylib
YYTest中的断点调试设置
-
打断点调试发现断点无效;
-
解决方案:YYTest -> Build Phases -> Compile Sources中 将main.m拖到最上面;
2.源码中的断点无效;
- 解决方案:
Build Setting --> 将Enable Hardened Runtime 置为NO