扩展—配置objc4源码编译调试方法

本文为L_Ares个人写作,包括图片皆为个人亲自操作,以任何形式转载请表明原文出处。

主要用来编译苹果官方开源出来的一些源码,针对objc4的源码可以进行LLDB调试,流程的跟踪,可以更好的学习oc的底层源码和思路。

附带我已经配置好的objc4-781可调试源码,免得看完以后觉得配置起来太麻烦了,直接下载就可以用,提取码: tpje

一、准备工作。

  1. 先找到 objc4 的下载网址。本文以最新的objc4-781进行配置。

  2. 这里是你所需要的所有依赖文件,将整个文件夹放进去,修改Header Search Paths,如果出错,根据下面的错误修改方法修改。提取码 : qeag

  3. 想要自己找的,可以去 Apple Open Source 中的MacOS下面的 MacOS 10.15MacOS 10.15.1找到大多数的依赖文件。

1.1.png
  1. pthread_machdep.h文件,进去直接用浏览器的commond + F寻找到就可以,一定是.h文件。

  2. CrashReporterClient.h文件,进去第一个好像就是。

  3. 下载好的需要的文件,与2的区别是 : 这个是官网下载的文件,没有挑出来需要的头文件,需要自己按照下面的步骤去挑选。提取码 : aces

二、配置

先看好objc4-781的原始目录结构,如下图2.0所示:

2.0.png

下面开始正式的配置。

首先,我们确定一个规则,就是每解决一个问题,都要再运行一次,这样才会显示新的问题,直到成功。

运行objc4-781项目,然后就会出现各种错误,下面依次的解决。

1. 找不到macosx.internal的sdk文件。

unable to find sdk 'macosx.internal'

解决办法 :

2.1.2.png

注意 : objcobjec-trampolines都要修改,步骤一样,如下:

target --> Build Settings --> AllCombined --> Architectures --> Base SDK --> macOS 10.15

2. 各种找不到头文件

首先,在工程中先创建一个JDHeaders文件夹,JDHeaders这个名字自己随意写,用以存放所有导入的依赖文件。

设置文件检索路径,即在target --> objc --> Build Settings --> Search Paths --> Header Search Paths 中添加$(SRCROOT)/JDHeaders

2.2.0.png

这里注意 :

但凡是这种带有"/"的,表明路径都不止一层,所以都要在JDHeaders的文件夹下,再根据缺少的头文件的路径的名字,创建一个文件夹。

我拿问题(1)举个例子,后面的跟问题(1)的处理方式一模一样。

问题(1). 'sys/reason.h' file not found

xnu-6153.11.26/bsd/sys中的reason.h文件放入自己在JDHeaders文件夹下创建的sys文件夹下。

缺少的是sys/reason.h,所以必须在JDHeaders下再创建一个sys文件夹,这才符合这个路径。

2.2.1.png
问题(2). 'mach-o/dyld_priv.h' file not found

dyld-733.6/include/mach-o/中的dyld_priv.h文件放入自己在JDHeaders文件夹下创建的mach-o文件夹下。

这时候会发现,本来只是1个问题,现在变成9个了。

2.2.2.png

dyld_priv.hbridgeos(3.0)报错,直接删除, bridgeos(3.0),逗号别忘了删。

然后在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
问题(3). 'os/lock_private.h' file not found'os/base_private.h' file not found

这两个丢失的文件可能不是一起报错的,但是一定会需要,所以一起加进来就行了,免得啰嗦。

libplatform-220/private/os/中的lock_private.h文件和base_private.h放入自己在JDHeaders文件夹下创建的os文件夹下。

在你的lock_private.h可能又报bridgeos(4.0),处理方法一样,直接删除bridgeos(4.0)

2.2.3.png
问题(4). 'pthread/tsd_private.h' file not found'pthread/spinlock_private.h' file not found

一起说掉,这两个也是肯定会需要的,只不过可能不是一起报错,一起说。

libpthread-416.11.1/private/中的tsd_private.h文件和spinlock_private.h放入自己在JDHeaders文件夹下创建的pthread文件夹下。

问题(5). 'System/machine/cpu_capabilities.h' file not found

xnu-6153.11.26/osfmk/machine/中的cpu_capabilities.h文件放入自己在JDHeaders文件夹下创建的System/machine文件夹下。

问题(6). 'os/tsd.h' file not found

xnu-6153.11.26/libsyscall/os/中的tsd.h文件放入自己在JDHeaders文件夹下创建的os文件夹下。

问题(7). 'System/pthread_machdep.h' file not found

pthread_machdep.h文件放入自己在JDHeaders文件夹下创建的System文件夹下。

然后提示:

Typedef redefinition with different types ('int' vs 'volatile OSSpinLock' (aka 'volatile int'))

Static declaration of '_pthread_has_direct_tsd' follows non-static declaration

Static declaration of '_pthread_getspecific_direct' follows non-static declaration

Static declaration of '_pthread_setspecific_direct' follows non-static declaration

2.2.4.png

遇到这种问题,把他们,包括函数的实现都注释掉就行。

问题(8). 'CrashReporterClient.h' file not found

CrashReporterClient.h文件放入JDHeaders文件夹下。

并且在Build Settings-> Preprocessor Macros中添加LIBC_NO_LIBCRASHREPORTERCLIENT

2.2.5.png
问题(9). 'objc-shared-cache.h' file not found

dyld-733.6/include/中的objc-shared-cache.h文件放入JDHeaders文件夹下。

问题(10). Mismatch in debug-ness macros
2.2.6.png

直接把这一行注释掉。

问题(11). '_simple.h' file not found

libplatform-220/private/中的_simple.h文件放入自己在工程JDHeaders文件夹下。

问题(12). 'Block_private.h' file not found

libclosure-74/中的Block_private.h文件放入自己在工程JDHeaders文件夹下。

问题(13). 'kern/restartable.h' file not found

xnu-6153.11.26/osfmk/kern/中的restartable.h文件放入自己在JDHeaders文件夹下创建的kern文件夹下。

至此,缺少头文件的问题全部都解决了。

3. 文件动态库问题

ld: can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/AppleInternal/OrderFiles/libobjc.order

2.3.1.png

解决办法 :

target -> objc -> Build Settings中,搜索Order File,在其下添加$(SRCROOT)/libobjc.order

2.3.2.png

4. 找不到lCrashReporterClient

ld: library not found for -lCrashReporterClient

2.4.1.png

解决办法 :

target -> objc -> Build Settings中,搜索Other Linker Flags,在其下删除-lCrashReporterClientDebugRelease中的都要删除掉。

2.4.2.png

5. Xcode的脚本编译问题

(1). SDK "macosx.internal" cannot be located.

(2). 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)

(3). unable to find utility "clang++", not a developer tool or in PATH

2.5.1.png

解决办法 :

target -> objc -> Build Phases -> Run Script(markgc)中,将脚本文本macosx.internal改成macosx

2.5.2.png

到此为止,所有的出现过的error都搞定了。command + B,应该是Build Succeeded,如果不是,请留言错误。

如果是的话,你的目录结构应该是这样的了:

成功的目录结构.png

三、 编译调试

(1). 新建一个TARGET
3.1.1.png
3.1.2.png

注意画了红色方框的,别选错了。

3.1.3.png

点击Finish就行了,然后目录结构多了一个JDObjc文件夹了。TARGETS里面也多出来了一个JDObjc的可执行文件。

3.1.4.png
(2). 设置依赖,导入动态库

TARGETS -> JDObjc -> Build Phases中设置。

3.2.1.png
3.2.2.png

设置完以后的 :

3.2.3.png
(3). Xcode 11 以上版本的新特性

target --> objc --> Build Settings 里找到Enable Hardened Runtime 将它的值设置成NO

3.3.1.png

(4). 在JDObjc文件夹下创建一个iOS的类进行调试

alloc挂上断点,进alloc里面,一直到callAlloc方法实现里面,挂上断点。

3.4.1.png
3.4.2.png

显示Build Succeeded,并且可以跳入断点的话就是成功配置了objc4-781的源码。

至此,我的配置方法就完成了,如果还有什么问题的话,可以在下面留言,大家一起讨论。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352