分享一個(gè)基于MachO
進(jìn)行內(nèi)存分區(qū)
的動(dòng)態(tài)庫
:libfooplugin.dylib
- 版權(quán): 【邏輯教育】
鏈接: https://pan.baidu.com/s/1mSHhy5s3pizlNnVfns7eSQ 密碼: 5ubg
- libfooplugin.dylib工具
- 內(nèi)存分析
1. libfooplugin.dylib工具
- 該工具可分析
C
、C++
脖苏、Swift
豌习、OC
語言的指針
所在區(qū)域
。
1.1 安裝:
方式一:
根目錄下創(chuàng)建
.lldbinit
文件:vim ~/.lldbinit
輸入:
plugin load /Users/XXX/XXX/libfooplugin.dylib
(
/Users/XXX/XXX/libfooplugin.dylib
替換為自己的存放路徑)
方式二:
- 在
任意目錄
下創(chuàng)建任意文件
纳账,文件內(nèi)容為:plugin load /Users/XXX/XXX/libfooplugin.dylib
(
/Users/XXX/XXX/libfooplugin.dylib
替換為自己的存放路徑)
- 在需要使用的
工程
中叉寂,選擇
剛才創(chuàng)建的文件
image.png
方式三:
在
lldb
中先調(diào)用方式二
創(chuàng)建的文件
:
image.png
1.2 使用
- 在lldb中:
cat address
+指針地址
赖瞒,進(jìn)行打印
image.png
2. 內(nèi)存分析
按照地址
從高
到低
排列: 棧區(qū)
-> 堆區(qū)
-> 全局靜態(tài)區(qū)
-> 常量區(qū)
-> 代碼區(qū)
(內(nèi)核區(qū)
和保留部分
不再考慮范圍內(nèi))
image.png
-
棧區(qū)
是從高地址
往低地址
分配空間震糖。 -
堆區(qū)
、全局靜態(tài)區(qū)
趴腋、常量區(qū)
吊说、代碼區(qū)
都是從低地址
往高地址
分配空間
(詳細(xì)的內(nèi)存分區(qū)
,可參考OC底層原理二十五:內(nèi)存五大區(qū) & 多線程)
下面是實(shí)踐驗(yàn)證
過程优炬。
2.1 棧區(qū)
-
局部變量
image.png
2.2 堆區(qū)
-
對(duì)象的指針
颁井,在棧區(qū)開辟
。對(duì)象的內(nèi)容
蠢护,是通過alloc
在堆中開辟
雅宾。
image.png
2.3 全局靜態(tài)區(qū)
- 創(chuàng)建一個(gè)
c語言
項(xiàng)目,全局變量
都存放在全局區(qū)
葵硕。
image.png -
已初始化
的眉抬,會(huì)直接分配
內(nèi)存,未初始化
的懈凹,是被調(diào)用
時(shí)蜀变,才分配
內(nèi)存。所以age地址
比age2
還高
介评。 -
全局靜態(tài)區(qū)
的數(shù)據(jù)
库北,在MachO
文件中:
已初始化
全局變量存放在__Data.__data
區(qū)域
未初始化
全局變量存放在__Data.__common
區(qū)域
補(bǔ)充爬舰,
static const
修飾的變量
,實(shí)際只是一個(gè)別名
寒瓦,沒有
獨(dú)立內(nèi)存空間
情屹。
image.png
- swift中,直接在
class外
杂腰,let
和var
創(chuàng)建的變量
垃你,都在全局靜態(tài)區(qū)
。
image.png
let a = 1
: 無法直接打印內(nèi)容颈墅,但可以匯編查看地址偏移
蜡镶,讀取偏移后的地址內(nèi)容
:
image.pngvar b = 2
:
image.png
2.4 常量區(qū)
-
c語言
:const
修飾的變量
,在常量區(qū)
image.png 本節(jié)恤筛,僅對(duì)這個(gè)
小工具
做記錄
和小實(shí)踐
官还。