iOS 檢查內(nèi)存泄漏的debug工具

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ì)沒有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很早以前就有了,只是沒在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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容