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

相关文章
|
11月前
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
412 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
移动开发 网络协议 小程序
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v10.0版已发布
RainbowChat是一套基于开源IM即时通讯聊天框架 MobileIMSDK 的产品级移动端IM系统。RainbowChat源于真实运营的产品,解决了大量的屏幕适配、细节优化、机器兼容问题。RainbowChat可能是市面上提供im即时通讯聊天源码的,唯一一款同时支持TCP、UDP两种通信协议的IM产品。与姊妹产品RainbowTalk和RainbowChat-Web 技术同源,历经考验。
276 0
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v10.0版已发布
|
7月前
|
iOS开发
ios虚拟摄像头插件,iPhone苹果替换相机软件,通过xposed框架实现
本项目包含三部分内容:1) 通过MobileSubstrate Hook系统相机进程,替换原始视频流数据的核心代码;2) 基于SwiftUI设计的多功能摄像头界面,支持摄像头切换、滤镜选择和视频源配置;3) 使用PHPickerViewController实现本地视频选择、时长滑块控制及视频裁剪导出功能。适用于学习iOS底层Hook技术与现代UI开发结合的应用场景。下载地址:https://www.pan38.com/share.php?code=BCjmZ,提取码:8888(仅供学习参考)。
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
335 1
|
10月前
|
Swift iOS开发 开发者
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
1814 13
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
|
7月前
|
安全 数据安全/隐私保护 iOS开发
ios一键新机硬改软件,苹果改机型用什么插件,串号Imei过检测工具
本文介绍了苹果设备的安全机制、开发接口及企业解决方案。核心安全包括硬件级防护(Secure Enclave、IMEI锁、T2芯片)和软件防护(启动链验证、KTRR、沙盒控制)。
|
安全 数据安全/隐私保护 Android开发
【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
2297 75
|
10月前
|
存储 数据安全/隐私保护 开发者
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
517 8
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
|
11月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
443 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
11月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
523 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡

热门文章

最新文章