源码调试准备
objc_debug
可编译苹果官方源码objc!可编译源码,LLDB调试,方便大家探索学习!
苹果开源 :macos 最新 10.15.6 objc版本:781
objc4-756.2很多小伙伴在探索底层的时候经常很苦恼,只能靠猜测!稍微灵活一点的小伙伴会通过
Apple
提供的源码来辅助看一下,但是很显然这不太直观!如果能够直接编译调试,像我们自己的代码直接 LLDB 调试,流程跟踪。那简直不要太爽,于是我编译了现在最新的iOS_objc4-756.2
准备工作
如果想先来体验一把的小伙伴可以直接 GitHub 源码 下载!
如果你也想亲自体验一把,请你准备条件:
- mac OS 10.14
- Xcode 10.1
- objc4-756.2
以上资料都可以在 Apple source 获取到。
开始配置
i386 架构问题
首先你下载的iOS_objc4-756.2
直接编译会报错如下:
Showing Recent Messages
The i386 architecture is deprecated. You should update your ARCHS build setting to remove the i386 architecture.
图片.png
解决: 将
objc
和objc-trampolines
中的Build Settings
选项Architectures
中的值切换为Standard Architectures(64-bit Intel)
文件查漏补缺
图片.png'sys/reason.h' file not found
这个资料我已经给大家找好了:
- 大家可以通过 GitHub 源码 下载,路径在
objc-756.2编译资料/xnu-4903.241.1/bsd/sys/reason.h
- 或者大家可以通过 Apple source 在
xnu-4903.241.1/bsd/sys/reason.h
路径自行下载 - 还可以通过谷歌中输入
reason.h site:opensource.apple.com
定向检索
把找到的文件加入到工程里面。例如:
- 我在根目录创建了一个
KCCommon
文件 - 创建
sys
文件 - 把
reason.h
文件加入进去
目前还不行,一定给我们的工程设置文件检索路径
- 选择
target
->objc
->Build Settings
- 在工程的
Header Serach Paths
中添加搜索路径$(SRCROOT)/KCCommon
图片.png
'mach-o/dyld_priv.h' file not found
'os/lock_private.h' file not found
'os/base_private.h' file not found
'pthread/tsd_private.h' file not found
'System/machine/cpu_capabilities.h' file not found
'os/tsd.h' file not found
'pthread/spinlock_private.h' file not found
'System/pthread_machdep.h' file not found
'CrashReporterClient.h' file not found
'objc-shared-cache.h' file not found
'_simple.h' file not found
'Block_private.h' file not found
上面的报错情况处理方式都是和 'sys/reason.h' file not found
一样的解决
文件补漏情况如下图:
图片.pngCrashReporterClient异常
我们如果直接导入 Apple source 下载的 CrashReporterClient
还是会报错:
'CrashReporterClient.h' file not found
解决:
- 需要在
Build Settings
->Preprocessor Macros
中加入:LIBC_NO_LIBCRASHREPORTERCLIENT
- 或者下载我给大家的文件
CrashReporterClient
,这里面我们直接更改了里面的宏信息#define LIBC_NO_LIBCRASHREPORTERCLIENT
dyld_priv 文件修改
GitHub 源码 这是修改过的!下面板书我修改了什么
报错:Use of undeclared identifier ‘DYLD_MACOSX_VERSION_10_13
在 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
libobjc.order 路径问题
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
lCrashReporterClient 编译不到
Library not found for -lCrashReporterClient
- 选择
target
->objc
->Build Settings
- 在
Other Linker Flags
中删除-lCrashReporterClient
(Debug
和Release
都删了)
图片.png
_objc_opt_class 无法编译
Undefined symbol: _objc_opt_class
这个问题是因为要适配新系统:MacOS 10.15, 因为现在笔者写这一篇文章的时候,还没有正式版本推送!这里我们向下兼容 MacOS 10.14
Xcode 脚本编译问题
/xcodebuild:1:1: SDK "macosx.internal" cannot be located.
/xcrun:1:1: sh -c '/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -sdk macosx.internal -find clang++ 2> /dev/null' failed with exit code 16384: (null) (errno=No such file or directory)
/xcrun:1:1: unable to find utility "clang++", not a developer tool or in PATH
- 选择
target
->objc
->Build Phases
->Run Script(markgc)
- 把脚本文本
macosx.internal
改成macosx
ObjectiveC.apinotes 异常
no such public header file: '/tmp/objc.dst/usr/include/objc/ObjectiveC.apinotes'
- 选择
target
->objc
->Build Settings
-
Text-Based InstallAPI Verification Model
中添加搜索路径Errors Only
-
Other Text-Based InstallAPI Flags
清空所有内容
编译成功
接下来你可以编译 - Build Succeeded
- 恭喜你!💐
可能到这里你已经老血吐了一地了!的确配置过程还是相对来说有点恶心,尤其是文件的查漏补缺,但是我们享受编译成功的喜悦吧!
objc 编译调试
- 新建一个
Target
: LGTest
- 绑定二进制依赖关系
- 运行代码进入源码,大家可以自由编译调试咯!