為了便于我們更好的學習蘋果的底層的內(nèi)存的分配,所以將蘋果的官方libmalloc源碼編譯好以便我們能夠更好的去動態(tài)調(diào)試。
說明:由于里面刪除了好多的東西,并且注釋了好多(也不知道有無影響),所以該方式僅供參考
自己搭建好的項目github
集成思路見下:
準備工作:
將綠色的3個壓縮包解壓到桌面libs文件夾里面(libs文件夾是自己創(chuàng)建的,這里隨便啥名字都行,主要是為了接下來文件缺失,直接查找用的)
1.首先我們將下載好的壓縮包解壓,打開工程文件
2.刪除不需要的target
如下:除了libsystem_malloc的其他的都給刪除掉
3.刪除如下的文件夾
4.刪除不需要的文件
在左下角搜索以下文件
replay、radix
5.開始編譯
所遇到的問題如下
-
問題1:
libmalloc_3.png- 解決:在libs文件里面搜索:_simple.h(選擇文件路徑為libplatform-177.200.16里面的)
-
拖入include根文件里面下,再配置文件路徑
libmalloc_4.png
-
問題2:
libmalloc_5.png- 現(xiàn)在:在include文件下創(chuàng)建一個platform的文件夾
- 再libs文件里面搜索:string.h,選擇libplatform-177.200.16文件下的,拖入到剛剛創(chuàng)建的platform的文件夾內(nèi)
-
問題3:
libmalloc_6.png 解決的方法 類似問題2(注意 選擇的的文件的路徑)
-
問題4:
libmalloc_7.png 解決(方法類似問題2) 創(chuàng)建mach-o文件夾,拖入所需的.h文件
-
問題5:
libmalloc_8.png- 在inclue文件夾下創(chuàng)建os文件夾、在os文件夾下創(chuàng)建internal文件夾,再將libs文件里面搜索到的internal_shared.h拖入到11·該文件夾下
-
問題6:
libmalloc_9.png- 解決:刪除“, bridgeos(3.0)”
-
問題7:
libmalloc_10.png- 解決方法類似同上
-
問題8:
libmalloc_11.png- 解決方法類似同上(選擇的文件路徑為:os/internal下的)
-
問題9:
libmalloc_12.png- 解決方法類似同上(選擇的文件路徑為:os/internal下的)
-
問題10:
libmalloc_13.png- 解決方法類似同上
-
問題11:
libmalloc_14.png- 解決方法類似同上
-
問題12:
libmalloc_15.png- 解決方法類似同上
-
問題13:
libmalloc_16.png- 解決方法類似同上(創(chuàng)建 machine文件夾,拖入文件)
-
問題14:
libmalloc_17.png
發(fā)現(xiàn)缺少 宏定義
見問題15
問題15:對于繼續(xù)缺少的宏定義(這里我統(tǒng)一的加入到了missingDefines.h文件里)
里面的內(nèi)容:我是從cpu_capabilities.h文件里面找入的
文件路徑:xnu-4903.221.2/osfmk/arm/cpu_capabilities.h
在internal.h文件里面:頂部添加引入 #include "missingDefines.h"-
問題16:
libmalloc_18.png 解決:handle_msl_memory_event 、malloc_memory_event_handler 這2個函數(shù) (將其注釋掉)
-
問題17:
libmalloc_19.png 解決:
//注釋掉下面的代碼
#if defined(__i386__) || defined(__x86_64__)
if (_COMM_PAGE_VERSION_REQD > (*((uint16_t *)_COMM_PAGE_VERSION))) {
MALLOC_REPORT_FATAL_ERROR((*((uint16_t *)_COMM_PAGE_VERSION)), "comm page version mismatch");
}
#endif
-
問題18:
libmalloc_20.png
解決:刪除nanov2_malloc.c、nanov2_malloc.h、nanov2_zone.h 將所有關于nanov2的缺失的.h文件都注釋掉
-
問題19:
libmalloc_21.png
解決 :
//改為:
void
_malloc_fork_child(void)
{
#if CONFIG_NANOZONE
if (_malloc_initialize_pred) {
{
nano_forked_zone((nanozone_t *)inline_malloc_default_zone());
}
}
#endif
return _malloc_reinit_lock_all(&__stack_logging_fork_child);
}
-
libmalloc_23.png
該為:
zone = nano_create_zone(helper_zone, malloc_debug_flags);
到此:command+B 編譯成功了
總的所添加的文件結構:
我們來新建一個myTest的Target來測試一下:(配置如下)
在main.m文件里面
#import <Foundation/Foundation.h>
#import <malloc/malloc.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
char *m;
m = (char *)(malloc(24)); //動態(tài)分配24個字節(jié)
NSLog(@"所占大小%lu",malloc_size(m));//這里打印了32
}
return 0;
}
運行編譯報錯:
我們把這一行給注釋掉
再次運行:在
//打個斷點
m = (char *)(malloc(24)); //動態(tài)分配24個字節(jié)
發(fā)現(xiàn)成功進入了malloc.c的文件里面(成功了)
友情鏈接:
配置運行objc4-750和使用