Zombie
zombie的原理是用生成僵尸對(duì)象來(lái)替換dealloc的實(shí)現(xiàn)免猾,當(dāng)對(duì)象引用計(jì)數(shù)為0的時(shí)候,將需要dealloc的對(duì)象轉(zhuǎn)化為僵尸對(duì)象。如果之后再給這個(gè)僵尸對(duì)象發(fā)消息,則拋出異常玄糟,并打印出相應(yīng)的信息,調(diào)試者可以很輕松的找到異常發(fā)生位置袄秩。
AddressSanitizer
AddressSanitizer的原理是當(dāng)程序創(chuàng)建變量分配一段內(nèi)存時(shí)阵翎,將此內(nèi)存后面的一段內(nèi)存也凍結(jié)住,標(biāo)識(shí)為中毒內(nèi)存之剧。
當(dāng)程序訪問(wèn)到中毒內(nèi)存時(shí)(越界訪問(wèn))郭卫,就會(huì)拋出異常,并打印出相應(yīng)log信息背稼。調(diào)試者可以根據(jù)中斷位置和的log信息贰军,識(shí)別bug。如果變量釋放了蟹肘,變量所占的內(nèi)存也會(huì)標(biāo)識(shí)為中毒內(nèi)存词疼,這時(shí)候訪問(wèn)這段內(nèi)存同樣會(huì)拋出異常(訪問(wèn)已經(jīng)釋放的對(duì)象)。
AddressSanitizer 優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
AddressSanitizer比Zombie擁有更強(qiáng)大的捕獲能力帘腹,特別是在malloc對(duì)象和內(nèi)存越界方面贰盗,zombie幾乎無(wú)能為力。如果在debug的時(shí)候無(wú)法捕獲異常阳欲,上線之后crash log中概率性的EXC_BAD_ACCESS簡(jiǎn)直是一種災(zāi)難舵盈。
缺點(diǎn):
1.AddressSanitizer可能會(huì)沒(méi)有l(wèi)og,不過(guò)會(huì)在訪問(wèn)中毒內(nèi)存的代碼處斷住球化,這倒是對(duì)debug影響不大秽晚。
2.使用AddressSanitizer除了分配對(duì)象的內(nèi)存之外,還需要額外的內(nèi)存筒愚,這會(huì)導(dǎo)致App內(nèi)存大量增加赴蝇,用起來(lái)有可能會(huì)比較卡。
總的來(lái)說(shuō)巢掺,AddressSanitizer優(yōu)點(diǎn)大于缺點(diǎn)扯再。
使用
在Xcode上方選擇設(shè)備的地方,點(diǎn)擊工程名字址遇,選擇Edit Scheme。在Diagnostics中選中enable address sanitizer即可斋竞。
AddressSanitizer開啟之后倔约,在debug過(guò)程中,如果遇到EXC_BAD_ACCESS的問(wèn)題坝初,Xcode會(huì)自動(dòng)中斷浸剩,拋出異常
其他compiler flags
實(shí)際AddressSanitizer很早以前就有了钾军,只是沒(méi)在Xcode中集成而已。除了AddressSanitizer還有很多其他的compiler flags绢要,undefined-trap就是其中的一種吏恭。undefined-trap的功能也非常強(qiáng)大,它可以檢測(cè)出程序中的不明確行為重罪,如數(shù)據(jù)溢出等樱哼。
下面我們以u(píng)ndefined-trap舉例,看看怎么用其他的compiler flags:
在Build Settings中的Custom Compiler Flags下為other C Flags添加-fsanitize=undefined-trap -fsanitize-undefined-trap-on-error
完成undefined-trap的設(shè)置之后剿配,當(dāng)程序的數(shù)據(jù)發(fā)生溢出行為時(shí)搅幅,系統(tǒng)就會(huì)拋出異常。
結(jié)束語(yǔ):
經(jīng)過(guò)ARC的洗禮之后呼胚,普通的訪問(wèn)釋放對(duì)象產(chǎn)生的EXC_BAD_ACCESS已經(jīng)大量減少了茄唐,現(xiàn)在出現(xiàn)的EXC_BAD_ACCESS有很大一部分來(lái)自malloc的對(duì)象或者越界訪問(wèn)。簡(jiǎn)單的敵人已經(jīng)被干掉蝇更,剩下的都是難纏的對(duì)手了沪编。還好Apple給我們升級(jí)了裝備,以后遇到EXC_BAD_ACCESS應(yīng)該不用那么心驚膽戰(zhàn)了吧年扩?
參考文獻(xiàn):
https://blog.csdn.net/xbenlang/article/details/49490563