可編譯版本
前言
從源碼的角度分析、學(xué)習(xí)iOS Runtime,這是第一篇,介紹編譯和調(diào)試 Runtime源碼
下載源碼
下載
前往源碼地址下載最新的Runtime源碼,本文使用的是

objc4-709版本
解壓
雙擊下載好的obc4-709.tar.gz解壓得到如下圖的文件

雙擊打開
objc.xcodeproj

創(chuàng)建調(diào)試Target
創(chuàng)建target
創(chuàng)建一個 command line target 命名為 objc-debug

添加依賴
將靜態(tài)庫工程objc添加為objc-debug的依賴,并在Link Binary With Libraries中添加libobjc.A.dylib

編譯
cmd+B編譯,出現(xiàn)編譯錯誤sys/reason.h

創(chuàng)建頭像文件目錄
在objc4-709目錄中創(chuàng)建include目錄,并在objc-debug和objc的Target中。Build Settings>Search Paths>Header Search Paths 添加 $(SRCROOT)/include

下載缺失頭文件
使用Google搜索reason.h site:opensource.apple.com,百度不行。由于reason.h在sys目錄下,所以在include目錄中創(chuàng)建sys目錄,并將reason.h放入sys目錄中,重新編譯。

以同樣的方式下載并添加到include目錄中,繼續(xù)編譯

以同樣的方式下載并添加到include目錄中,繼續(xù)編譯

以同樣的方式下載并添加到include目錄中,繼續(xù)編譯

把所有需要的頭文件都加入include目錄中。
修改部份頭文件中的定義
修改CrashReporterClient.h 添加 #define LIBC_NO_LIBCRASHREPORTERCLIENT
修改objc-os.h 在#include "objc-config.h"下面添加#include <pthread/qos_private.h>
編譯出現(xiàn)以下錯誤

在Order File中添加$(SRCROOT)/libobjc.order

繼續(xù)編譯出現(xiàn)以下錯誤

解決方式是在Other Linker Flags中刪除-lCrashReporterClient

編譯成功
調(diào)試
通過修改部份代碼,調(diào)整設(shè)置終于可以調(diào)試了。在NSObject.mm中添加如下斷點。

結(jié)語
通過一系列的調(diào)整,就可以調(diào)試runtime源碼了。