1、alloc分析、源碼調(diào)試(1)

1、基于斷點(diǎn)的底層探索(\color{red}{基于iOS 13.7,xcode 11.7, MacOs 10.15.6,objc4-781}

定義一個Person類:
person類

\color{indigo}{第一步}:點(diǎn)擊進(jìn)入alloc方法的定義,找到

+ (instancetype)alloc OBJC_SWIFT_UNAVAILABLE("use object initializers instead");

之后無法進(jìn)一步追溯。

\color{indigo}{第二步}:符號斷點(diǎn)alloc方法,匯編代碼分析。

注:app啟動預(yù)先會調(diào)用很多alloc方法,最好在Person類的alloc之前都disable符號斷點(diǎn),得到如下:
_objc_rootAlloc方法

繼續(xù)符號斷點(diǎn)搜索_objc_rootAlloc得到:
跳轉(zhuǎn)_objc_rootAllocWithZone,所屬libobjc.A.dylib
繼續(xù)符號斷點(diǎn)搜索_objc_rootAllocWithZone得到
calloc方法,所屬 libsystem_malloc.dylib
繼續(xù)符號斷點(diǎn)搜索calloc
malloc_zone_calloc方法,所屬libsystem_malloc.dylib

得到malloc_zone_calloc方法,如果繼續(xù)用符號斷點(diǎn)進(jìn)行跟進(jìn)會發(fā)現(xiàn)沒有明顯的alloc的標(biāo)示,無法進(jìn)一步分析,這時候就需要源碼分析了。

2、objc4源碼環(huán)境配置

源碼路徑地址:https://opensource.apple.com/ 下載地址:https://opensource.apple.com/tarballs
可以在iOS最新版本中web界面搜索objc找到如下:(這里為什么搜索objc,主要之前是基于libobjc.A.dylib,同樣也可以搜索malloc,基于libsystem_malloc.dylib)

objc4-781源碼
打開工程,新建一個command tools的target,設(shè)置庫的引用和定義的person類
庫和引用
main方法
然后運(yùn)行,會發(fā)現(xiàn)報(bào)錯,\color{red}{unable\ to\ find\ sdk 'macosx.internal'} 問題,將objc和objc-trampolines兩個target中的build setting->Base SDK 改為macos最新版本。

然后運(yùn)行,會發(fā)現(xiàn)報(bào)錯 找不到頭文件,這里參考了Style_月月同學(xué)文章 http://www.itdecent.cn/p/2fae148f015f,添加相應(yīng)的缺失文件。這里我補(bǔ)充一下我遇到的兩個個文件補(bǔ)充完后仍存在的文章未提到的問題:
1、\color{red}{objc-os.h}文件方法中存在一個\color{red}{lock()}方法,宏定義報(bào)錯。

uint32_topts = OS_UNFAIR_LOCK_DATA_SYNCHRONIZATION | OS_UNFAIR_LOCK_ADAPTIVE_SPIN; 

由于沒有\color{red}{OS\_UNFAIR\_LOCK\_ADAPTIVE\_SPIN}這個定義所以報(bào)錯,這里將后面這個選項(xiàng)刪除。
2、文件\color{red}{objc-errors.mm}中,\color{red}{CRGetCrashLogMessage()}方法報(bào)錯。
\color{red}{objc->target->build setting->Preprocessor Marcros} 添加\color{red}{LIBC\_NO\_LIBCRASHREPORTERCLIENT},debug和release都加入。

這樣就可以繼續(xù)調(diào)試了


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容