什么是野指針
維基百科里給的定義:
當所指向的對象被釋放或者收回,但是對該指針沒有作任何的修改荧嵌,以至于該指針仍舊指向已經(jīng)回收的內存地址,此情況下該指針便稱迷途指針(即通常說的野指針)。
若操作系統(tǒng)將這部分已經(jīng)釋放的內存重新分配給另外一個進程肛循,而原來的程序重新引用現(xiàn)在的迷途指針庆寺,則將產(chǎn)生無法預料的后果蚊夫。
因為此時迷途指針所指向的內存現(xiàn)在包含的已經(jīng)完全是不同的數(shù)據(jù)。
野指針分類:
引用騰訊bugly團隊的一張圖解
背景
目前國際美居APP存在大量零散的野指針閃退
野指針所指向的內容存在很大的不確定懦尝,可能是未使用的內存知纷,也可能是已經(jīng)被覆蓋的內存壤圃。
同時野指針還有崩潰堆棧延時、隨機琅轧、不必現(xiàn)等特性造成了crash的難以準確定位以及修復
解決思路
目前xcode提供兩種野指針檢測的方法:Malloc scribbie 和 Zombie Objects
Malloc scribbie
根據(jù)蘋果官方文檔顯示伍绳,Malloc scribbie主要在釋放內存?dealloc?在內存上填?0x55
當訪問到對象內存中填充的是0x55時,程序就會出現(xiàn)異常
Zombie Objects
把釋放的對象乍桂,全都轉為僵尸對象【蘋果文檔】
當僵尸對象再次被訪問時冲杀,將進入消息轉發(fā)的流程,開始處理僵尸對象訪問睹酌,輸出日志并發(fā)生 Crash
推薦Zombie Objects方式:
鑒于我們項目大部分代碼都是OC代碼权谁,c\c++比較少
方案預研
主要考慮以下幾點
監(jiān)控策略:
全量監(jiān)控
自定義對象監(jiān)控
黑名單
白名單
內存回收策略:
最大僵尸內存空間
內存預警處理
FIFO
僵尸對象處理策略:
crash上報(sit/uat)
error上報(線上,降低crash率)
降級策略:
熱修復憋沿,關閉僵尸監(jiān)控
oss配置文件旺芽,APP啟動讀取配置
監(jiān)控流程
開啟檢測
dealloc替換
參考文檔