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ì)沒(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚁廓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子常遂,更是在濱河造成了極大的恐慌纳令,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件克胳,死亡現(xiàn)場(chǎng)離奇詭異平绩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)漠另,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門捏雌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人笆搓,你說(shuō)我怎么就攤上這事性湿。” “怎么了满败?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵肤频,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我算墨,道長(zhǎng)宵荒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮报咳,結(jié)果婚禮上侠讯,老公的妹妹穿的比我還像新娘。我一直安慰自己暑刃,他們只是感情好厢漩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岩臣,像睡著了一般溜嗜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上婿脸,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天粱胜,我揣著相機(jī)與錄音,去河邊找鬼狐树。 笑死焙压,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抑钟。 我是一名探鬼主播涯曲,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼在塔!你這毒婦竟也來(lái)了幻件?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛔溃,失蹤者是張志新(化名)和其女友劉穎绰沥,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贺待,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡言秸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年具壮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砂代,死狀恐怖日矫,靈堂內(nèi)的尸體忽然破棺而出般婆,到底是詐尸還是另有隱情已卷,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布雁比,位于F島的核電站稚虎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏偎捎。R本人自食惡果不足惜祥绞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一非洲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜕径,春花似錦、人聲如沸败京。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赡麦。三九已至朴皆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泛粹,已是汗流浹背遂铡。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晶姊,地道東北人扒接。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像们衙,于是被迫代替她去往敵國(guó)和親钾怔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354