啟動優化
dyld:檢查耗時反饋, 配置環境變量 DYLD_PRINT_STATISTICS
一般空項目啟動在400ms以內
main之前:pre-main
1、加載動態庫時間: 系統庫已經存在共享緩存中了,自己的盡量不要大于六個
2、rebase/rebinding時間 :mach-o文件、虛擬內存
3、注冊類的時間:注冊到全局表,catagory方法插入,廢棄的類(只要類存在工程中)
4、load方法、構造函數:不要做太多延遲的事情
rebase/rebinding
鏈接:編譯時
綁定:運行時 (懶加載方式)
早期的內存地址是物理地址:1、內存不夠;2、安全問題
后來 :懶加載,用哪里加載哪里
物理地址由cpu mmu 內存管理單元(硬件)管理
應用 - 虛擬地址 - 物理地址 -內存
映射表:page 內存單位
iOS(arm64):16k 大小與硬件相關
Mac:4k
MachO文件格式
順序:write link map file :YES
物理內存是由操作系統進行管理的,且不會對程序員提供接口的。
虛擬頁表:虛擬內存8G,訪問空間4G
執行的代碼訪問的是虛擬頁表中的地址(包括po)
載入內存過程中不活躍的內存會被覆蓋掉
二進制 8字節 超過8G的數字沒有了 0x00000100000001 0xffffffffffffffff
內存從4G開始。前4G不讓用,是因為隔離32位。
所以64位從0x00000100000000開始 小于這個地址是32位的。
8字節最高效
ASLR:讓每次生成的虛擬頁表首地址從隨機位置開始(iOS4.3)
編譯地址:偏移地址offset
rebase:ASLR+offfset
pagefault :當代碼訪問沒有被載入內存的數據會產生缺頁異常/缺頁中斷。
產生大量的缺頁異常用戶會感知,最常見冷啟動
二進制重排:減少pagefault次數,將啟動方法放到一起
函數前加 _ 就是符號
orderfile:./xy.order
tracing pcs:跟蹤cpu執行到的代碼
查看最后一個數據,stop位置往上走4個字節,是最后一個數據
三方的庫生成不了macho的沒必要hook
other c flags 插樁標識符:-fsanitize-coverage=func,trace-pc-guard
在SWift代碼中加入Chang插樁標識符other swift flags:
-sanitize-coverage=func
-sanitize=undefined
hook所有的回調函數
void __sanitizer_cov_trace_pc_guard(uint32_t *guard){
}
只要添加clang插樁的標記,就會在函數 block邊緣添加__sanitizer_cov_trace_pc_guard ,相當于修改二進制文件()
只會hook自己的代碼。
__sanitizer_cov_trace_pc_guard 會損耗性能
fname macho文件名
fbase 起始位置
sname 方法名
saddr 函數地址 虛擬地址
也可以打印方法所在線程。