分享一个基于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
方式三:
在
lldb中先调用方式二创建的文件:
image.png
1.2 使用
- 在lldb中:
cat address+指针地址,进行打印
image.png
2. 内存分析
按照地址从高到低排列: 栈区 -> 堆区 -> 全局静态区 -> 常量区 -> 代码区 (内核区和保留部分不再考虑范围内)

image.png
-
栈区是从高地址往低地址分配空间。 -
堆区、全局静态区、常量区、代码区都是从低地址往高地址分配空间
(详细的内存分区,可参考OC底层原理二十五:内存五大区 & 多线程)
下面是实践验证过程。
2.1 栈区
-
局部变量
image.png
2.2 堆区
-
对象的指针,在栈区开辟。对象的内容,是通过alloc在堆中开辟。
image.png
2.3 全局静态区
- 创建一个
c语言项目,全局变量都存放在全局区。
image.png -
已初始化的,会直接分配内存,未初始化的,是被调用时,才分配内存。所以age地址比age2还高。 -
全局静态区的数据,在MachO文件中:
已初始化全局变量存放在__Data.__data区域
未初始化全局变量存放在__Data.__common区域
补充,
static const修饰的变量,实际只是一个别名,没有独立内存空间。
image.png
- swift中,直接在
class外,let和var创建的变量,都在全局静态区。
image.png
let a = 1: 无法直接打印内容,但可以汇编查看地址偏移,读取偏移后的地址内容:
image.pngvar b = 2:
image.png
2.4 常量区
-
c语言:const修饰的变量,在常量区
image.png 本节,仅对这个
小工具做记录和小实践。










