iOS底层原理:苹果开源 objc4-818 源码项目的编译和调试(三)

简介: 作为一名iOS程序员,探索OC底层原理永不止息,同时也是永远的痛,最开始只能靠猜测!后面慢慢找到了苹果官方开源的源码来辅助看一下,但是尽管这样,还是显得不太直观!如果objc源码能够像我们自己创建的项目一样直接编译调试,像我们自己的代码一样能够直接 LLDB 调试,流程跟踪,那简直不要太爽。废话不多说,开炮~ 哦,不是,是开干~!🚀
报错29:'os/variant_private.h' file not found

同样是文件缺失,variant_private.h这个文件在

Libc-1439.141.1/os/目录下

解决方式:

  1. variant_private.hLibc-1439.141.1/os/目录下copy到JQDependencies/os/目录下
报错30:Use of undeclared identifier 'dyld_platform_version_bridgeOS_2_0'

image.png

解决方式:


  • 注释掉这5行代码


image.png


报错31:/os/variant_private.h:243:75: Expected ','


image.png

解决方式:


  • 删除bridgeos这个参数

报错32:** '_static_assert' declared as an array with a negative size**


image.png


解决方式:


  • 注释掉这两行代码


image.png


报错33:Can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk/AppleInternal/OrderFiles/libobjc.order


image.png

解决方式:


  • target -> objc -> Build Settings,在工程的Order File中添加搜索路径$(SRCROOT)/libobjc.order



image.png


报错34:Library not found for -lCrashReporterClient

没有找到CrashReporterClient这个Library库,


image.png


解决方式:


  • target -> objc -> Build Settings,在工程的Other Link Flags中删除-lCrashReporterClient

image.png


报错35:Library not found for -loah

和报错34类似,没有找到 oah 这个Library库

解决方式:

  • target -> objc -> Build Settings,在工程的Other Link Flags中删除-loah


image.png


报错36:xcodebuild:1:1: SDK "macosx.internal" cannot be located.

解决方式:

  • 选择 target -> objc -> Build Phases -> Run Script(markgc)
  • 把脚本文本macosx.internal改成macosx,和刚开始我们选的base sdk中的macosx对齐

image.png


OK!到此处,再次编译,** Build Succeeded**。objc这个源码库终于可以编译成功了!

image.png

三、objc源码调试


1. 新建target:JQObjcBuildDemo


image.png

image.png


2. 给JQObjcBuildDemo添加依赖库


  • 选择 target -> JQObjcBuildDemo -> General -> Frameworks and Libraries ,点击"+"添加 libobjc.A.dylib


image.png

image.png


然后检查一下,依赖库有没有添加进来。选择 target -> objc -> Build Phases,看一下DependenciesLink Binary With Libraries,如下图一样添加上了,就OK了!(ps: 如果没有添加,这里手动再添加一次。)


image.png

3. 调试objc源码


  1. Build Settings中将Enable Hardened Runtime设置为NO,否则在objc源码下的断点没法断住,这个是Xcode 11的新特性。


image.png

  1. 新建JQPerson类


  1. main.m中引入并实例化一个JQPerson


  1. 编译运行,如图


image.png

  1. 按住command,点击[JQPerson alloc]alloc,跳转到objc的源码中+ (id)alloc{,在这里打上断点

image.png


image.png


注意:源码中+ (id)alloc{这个断点要先禁用,等到程序断点断在了JQPerson p = [JQPerson alloc];这一行的时候,再去objc源码中开启+ (id)alloc{*这个方法的断点。否则,项目一运行,会有很多alloc方法断住,一步步执行,你会爆炸的。切记!!!


image.png

image.png


好了,到此,我们就可以愉快的进行objc的源码调试了,感兴趣的小伙伴赶紧来试试吧!

四、总结


  1. 项目中缺失的文件可能在你下载的依赖库中找不到,这个时候就要考虑一下去依赖库的新版本或者旧版本中找一下。比如我上面遇到的:'System/pthread_machdep.h'文件只有在Libc-825.40.1及以下版本才有。


  1. 缺失文件汇总


# 缺失文件名                               (对应的依赖库路径)          
1. 'sys/reason.h' file not found                         (xnu-7195.141.2/bsd/sys)
2. 'mach-o/dyld_priv.h' file not found                   (dyld-852.2/include/mach-o)
3. 'os/lock_private.h' file not found                    (libplatform-254.80.2/private/os)
4. 'os/base_private.h' file not found                    (libplatform-254.80.2/private/os)
5. 'pthread/tsd_private.h' file not found                (libpthread-libpthread-454.120.2/private/pthread)
6. 'pthread/spinlock_private.h' file not found           (libpthread-libpthread-454.120.2/private/pthread)
7. 'System/machine/cpu_capabilities.h' file not found    (xnu-7195.141.2/osfmk/machine)
8. 'os/tsd.h' file not found                             (xnu-7195.141.2/libsyscall/os)
9. 'System/pthread_machdep.h' file not found             (Libc-825.40.1/pthreads)
10. 'CrashReporterClient.h' file not found               (Libc-825.40.1/include)
11. 'objc-shared-cache.h' file not found                 (dyld-852.2/include)
12. 'objc-bp-assist.h' file not found                    文件的引用注释掉
13. '_simple.h' file not found                           (libplatform-libplatform-220.100.1/private)
14. 'os/linker_set.h' file not found                     (xnu-7195.141.2/bsd/sys)
15. 'Cambria/Traps.h' file not found                     文件在开源网站找不到 ,文件的引用注释掉
16. 'Block_private.h' file not found                    (libclosure-79/)
17. 'kern/restartable.h' file not found                 (xnu-7195.141.2/osfmk/kern/)
18. 'os/feature_private.h' file not found                文件的引用注释掉
19. 'os/reason_private.h' file not found                (xnu-7195.141.2/libkern/os/)
20. 'os/variant_private.h' file not found               (Libc-1439.141.1/os/)


  1. 已经完成 objc4-818 源码项目,大家可以直接去GitHub下载:JQObjc4-818.2BuildDebug

五、参考文章


最新macOS 10.15下objc4-779.1源码编译调试

相关文章
|
8月前
|
jenkins Unix 持续交付
个人记录jenkins编译ios过程 xcode是9.4.1
个人记录jenkins编译ios过程 xcode是9.4.1
122 2
|
8月前
|
存储 运维 安全
iOS加固原理与常见措施:保护移动应用程序安全的利器
iOS加固原理与常见措施:保护移动应用程序安全的利器
99 0
|
5天前
|
安全 数据安全/隐私保护 Android开发
【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
125 75
|
16天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
|
6月前
|
Unix 调度 Swift
苹果iOS新手开发之Swift 中获取时间戳有哪些方式?
在Swift中获取时间戳有四种常见方式:1) 使用`Date`对象获取秒级或毫秒级时间戳;2) 通过`CFAbsoluteTimeGetCurrent`获取Core Foundation的秒数,需转换为Unix时间戳;3) 使用`DispatchTime.now()`获取纳秒级精度的调度时间点;4) `ProcessInfo`提供设备启动后的秒数,不表示绝对时间。不同方法适用于不同的精度和场景需求。
204 3
|
5月前
|
语音技术 开发工具 图形学
Unity与IOS⭐一、百度语音IOS版Demo调试方法
Unity与IOS⭐一、百度语音IOS版Demo调试方法
|
2月前
|
存储 人工智能 安全
【通义】AI视界|苹果停止签署iOS 18.0.1,升级用户无法降级
本文由通义自动生成,涵盖24小时内精选的五条科技资讯:奥特曼谈OpenAI未来发展方向,ChatGPT新搜索功能上线遇故障,Perplexity AI选举搜索面临挑战,马斯克谈特斯拉造手机的可能性,以及苹果停止签署iOS 18.0.1。更多精彩内容,欢迎访问通通知道。
|
3月前
|
移动开发 网络协议 小程序
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v9.1版已发布
RainbowChat是一套基于开源IM聊天框架 MobileIMSDK 的产品级移动端IM系统。RainbowChat源于真实运营的产品,解决了大量的屏幕适配、细节优化、机器兼容问题
76 5
|
5月前
|
iOS开发
IOS编译出现Command PhaseScriptExecution failed with a nonzero exit code
IOS编译出现Command PhaseScriptExecution failed with a nonzero exit code
435 2
|
5月前
|
iOS开发
IOS编译报错‘ZipArchive.h‘ file not found|Use of undeclared identifier ‘SSZipArchive‘
IOS编译报错‘ZipArchive.h‘ file not found|Use of undeclared identifier ‘SSZipArchive‘
90 1