1、alloc分析、源码调试(1)

1、基于断点的底层探索(\color{red}{基于iOS 13.7,xcode 11.7, MacOs 10.15.6,objc4-781}

定义一个Person类:
person类

\color{indigo}{第一步}:点击进入alloc方法的定义,找到

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

之后无法进一步追溯。

\color{indigo}{第二步}:符号断点alloc方法,汇编代码分析。

注:app启动预先会调用很多alloc方法,最好在Person类的alloc之前都disable符号断点,得到如下:
_objc_rootAlloc方法

继续符号断点搜索_objc_rootAlloc得到:
跳转_objc_rootAllocWithZone,所属libobjc.A.dylib
继续符号断点搜索_objc_rootAllocWithZone得到
calloc方法,所属 libsystem_malloc.dylib
继续符号断点搜索calloc
malloc_zone_calloc方法,所属libsystem_malloc.dylib

得到malloc_zone_calloc方法,如果继续用符号断点进行跟进会发现没有明显的alloc的标示,无法进一步分析,这时候就需要源码分析了。

2、objc4源码环境配置

源码路径地址: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,设置库的引用和定义的person类
库和引用
main方法
然后运行,会发现报错,\color{red}{unable\ to\ find\ sdk 'macosx.internal'} 问题,将objc和objc-trampolines两个target中的build setting->Base SDK 改为macos最新版本。

然后运行,会发现报错 找不到头文件,这里参考了Style_月月同学文章 https://www.jianshu.com/p/2fae148f015f,添加相应的缺失文件。这里我补充一下我遇到的两个个文件补充完后仍存在的文章未提到的问题:
1、\color{red}{objc-os.h}文件方法中存在一个\color{red}{lock()}方法,宏定义报错。

uint32_topts = OS_UNFAIR_LOCK_DATA_SYNCHRONIZATION | OS_UNFAIR_LOCK_ADAPTIVE_SPIN; 

由于没有\color{red}{OS\_UNFAIR\_LOCK\_ADAPTIVE\_SPIN}这个定义所以报错,这里将后面这个选项删除。
2、文件\color{red}{objc-errors.mm}中,\color{red}{CRGetCrashLogMessage()}方法报错。
\color{red}{objc->target->build setting->Preprocessor Marcros} 添加\color{red}{LIBC\_NO\_LIBCRASHREPORTERCLIENT},debug和release都加入。

这样就可以继续调试了


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容