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源码编译调试

相关文章
|
2月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
118 1
|
3月前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
28天前
|
存储 人工智能 安全
【通义】AI视界|苹果停止签署iOS 18.0.1,升级用户无法降级
本文由通义自动生成,涵盖24小时内精选的五条科技资讯:奥特曼谈OpenAI未来发展方向,ChatGPT新搜索功能上线遇故障,Perplexity AI选举搜索面临挑战,马斯克谈特斯拉造手机的可能性,以及苹果停止签署iOS 18.0.1。更多精彩内容,欢迎访问通通知道。
|
2月前
|
移动开发 网络协议 小程序
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v9.1版已发布
RainbowChat是一套基于开源IM聊天框架 MobileIMSDK 的产品级移动端IM系统。RainbowChat源于真实运营的产品,解决了大量的屏幕适配、细节优化、机器兼容问题
59 5
|
3月前
|
IDE 开发工具 Android开发
安卓与iOS开发对比:平台选择对项目成功的影响
【9月更文挑战第10天】在移动应用开发的世界中,选择正确的平台是至关重要的。本文将深入探讨安卓和iOS这两大主要移动操作系统的开发环境,通过比较它们的市场份额、开发工具、编程语言和用户群体等方面,为开发者提供一个清晰的指南。我们将分析这两个平台的优势和劣势,并讨论如何根据项目需求和目标受众来做出最佳选择。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解每个平台的特性,并指导你做出明智的决策。
|
3月前
|
Java 开发工具 Android开发
安卓与iOS开发:平台选择对项目成功的影响
在移动应用开发的浩瀚宇宙中,安卓和iOS两大星系璀璨夺目,各自拥有独特的光芒。本文将穿梭于这两个平台之间,探讨它们在开发环境、用户群体、成本效益等方面的差异,以及这些差异如何影响一个项目的航向和终点。我们将从初学者的视角出发,逐步深入,揭示选择合适平台的重要性,以及如何根据项目需求做出明智的选择。无论你是即将启航的新手开发者,还是已经在这片星海中航行的老手,这篇文章都将为你提供有价值的导航信息。
58 2
|
3月前
|
Java 开发工具 Android开发
探索安卓与iOS开发的差异:平台选择对项目的影响
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据着重要的位置。本文旨在深入探讨这两个平台在开发过程中的主要差异,包括编程语言、开发工具、用户界面设计、性能优化以及市场分布等方面。通过对比分析,我们将揭示平台选择如何影响项目规划、执行效率和最终成果,为开发者在选择适合自己项目需求的平台时提供参考依据。
|
4月前
|
IDE 开发工具 Android开发
探索iOS与安卓开发的差异:平台选择对项目成功的影响
【8月更文挑战第22天】在数字化时代,移动应用成为企业和个人展示创意、提供服务的重要工具。iOS和安卓作为两大主流平台,各自拥有独特的优势和限制。本文将深入探讨这两个平台在开发过程中的主要差异,以及这些差异如何影响项目规划、用户体验和市场策略。通过比较分析,旨在为开发者和企业决策者提供有价值的见解,帮助他们根据项目需求做出明智的平台选择。
|
iOS开发
IOS吹一吹原理的实现
http://zcg9033586.blog.163.com/blog/static/17521731020111154286625/
700 0
|
12天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。