欢迎来到底层世界,让我们一起打开通往底层世界的大门。
入门的三种方式:
查找指定函数的底层源码: 本文以
Person对象的alloc函数为例
-
符号断点跟流程 -
control+step into - 汇编查找
方法一: 符号断点跟流程
tips: 断点
高亮色为启动,鼠标左键再点一下会置灰,表示取消断点
- 入口断点
找到Person调用alloc的位置,鼠标左键点击编辑器左侧行数即可
手动断点.png
- 符号断点
step1: Xcode左上角切换到断点调试面板
断点调试面板.png
step2: Xcode左下角点击+号,点击Symbolic Breakpoint
符号断点.png
step3: 输入alloc,按键盘Enter键确认
alloc.png
- 开始调试
step1: 将alloc符号断点先置灰
alloc函数在很多地方被调用,在到达我们目标位置前,先置灰。
step2: Xcode开启运行,程序到达[Person alloc]断点后, 开启符号断点。
step3: 点击 Xcode日志栏的继续运行按钮
继续运行.png
可以看到alloc是调用了底层libobjc.A.dylib的_objc_rootAlloc函数。
libobjc.A.dylib.png
恭喜你,你已成功找到底层入口
现在你可以选择进入下一篇章,**OC底层原理二:objc4-781编译环境** (真实的底层世界)
方法二:control + step into
step1: 同方法一一样,保留[Person alloc]断点,移除符号断点。
step2: 运行程序,进程停留在[Person alloc]断点处时,
setp3: 按住键盘control键+鼠标点击 Xcode日志栏的step into按钮
进入.png
进去后可以看到objc_alloc:
objc_alloc.png
step4: 加入objc_alloc符号断点(参照方法一的符号断点操作流程,将内容改为objc_alloc)
image.png
(其实我们已经看到符号断点显示了in libobjc.A.dylib内容。我们已经找到了底层库名称)
step5:点击 Xcode日志栏的继续运行按钮
继续运行.png
就找到了libobjc.A.dylib库,而且看到了底层调用了更深一级的_objc_rootAllocWithZone。
关于_objc_rootAllocWithZone与_objc_rootAlloc的关系,后面解析alloc时,会详细讲到。
image.png
libobjc.A.dylib.png
方法三: 汇编查找
step1: 同方法一一样,保留[Person alloc]断点,移除符号断点。Xcode开启运行,程序到达[Person alloc]断点后。
step2: 在顶部文件导航栏打开Debug -> Debug Workflow -> Always show Disassembly。
这个选项表示始终显示反汇编。
image.png
按图中2种方式都可找到libobjc.A.dylib底层库
image.png
libobjc.A.dylib.png
恭喜你,已掌握了三种寻找底层的方法
让我们进入下一篇章,OC底层原理二:objc4-781编译环境** (真实的底层世界)













网友评论