分享一个基于MachO
进行内存分区
的动态库
:libfooplugin.dylib
- 版权: 【逻辑教育】
链接: https://pan.baidu.com/s/1mSHhy5s3pizlNnVfns7eSQ 密码: 5ubg
- libfooplugin.dylib工具
- 内存分析
1. libfooplugin.dylib工具
- 该工具可分析
C
、C++
、Swift
、OC
语言的指针
所在区域
。
1.1 安装:
方式一:
根目录下创建
.lldbinit
文件:vim ~/.lldbinit
输入:
plugin load /Users/XXX/XXX/libfooplugin.dylib
(
/Users/XXX/XXX/libfooplugin.dylib
替换为自己的存放路径)
方式二:
- 在
任意目录
下创建任意文件
,文件内容为:plugin load /Users/XXX/XXX/libfooplugin.dylib
(
/Users/XXX/XXX/libfooplugin.dylib
替换为自己的存放路径)
- 在需要使用的
工程
中,选择
刚才创建的文件
image.png
方式三:
在
image.pnglldb
中先调用方式二
创建的文件
:
1.2 使用
- 在lldb中:
cat address
+指针地址
,进行打印
image.png
2. 内存分析
按照地址
从高
到低
排列: 栈区
-> 堆区
-> 全局静态区
-> 常量区
-> 代码区
(内核区
和保留部分
不再考虑范围内)
-
栈区
是从高地址
往低地址
分配空间。 -
堆区
、全局静态区
、常量区
、代码区
都是从低地址
往高地址
分配空间
(详细的内存分区
,可参考OC底层原理二十五:内存五大区 & 多线程)
下面是实践验证
过程。
2.1 栈区
-
局部变量
image.png
2.2 堆区
-
对象的指针
,在栈区开辟
。对象的内容
,是通过alloc
在堆中开辟
。
image.png
2.3 全局静态区
- 创建一个
c语言
项目,全局变量
都存放在全局区
。
image.png -
已初始化
的,会直接分配
内存,未初始化
的,是被调用
时,才分配
内存。所以age地址
比age2
还高
。 -
全局静态区
的数据
,在MachO
文件中:
已初始化
全局变量存放在__Data.__data
区域
未初始化
全局变量存放在__Data.__common
区域
补充,
image.pngstatic const
修饰的变量
,实际只是一个别名
,没有
独立内存空间
。
- swift中,直接在
class外
,let
和var
创建的变量
,都在全局静态区
。
image.png
let a = 1
: 无法直接打印内容,但可以汇编查看地址偏移
,读取偏移后的地址内容
:
image.pngvar b = 2
:
image.png
2.4 常量区
-
image.pngc语言
:const
修饰的变量
,在常量区
-
本节,仅对这个
小工具
做记录
和小实践
。
网友评论