Xcode調(diào)試內(nèi)存最新理解
前提:
Xcode 16.0 beta
設(shè)置
Scheme設(shè)置中勾選Malloc Scribble、Malloc Stack Logging。

這么做是為了在Memory Graph、Profile中追溯數(shù)據(jù)在哪句代碼生成。

此設(shè)置會(huì)導(dǎo)致App硬盤占用異常增多,調(diào)試完畢之后需要把選項(xiàng)關(guān)閉。
Allocations
許多人剛開始用它第一能看懂的是上方圖標(biāo)內(nèi)存的實(shí)時(shí)變化。但對(duì)下方的各種數(shù)據(jù)和選項(xiàng)就一臉懵逼。本文首先想介紹上下交界的選項(xiàng)。

選中不同選項(xiàng)會(huì)切換到不同的視角,本文會(huì)著重提及后三個(gè)。
Allocations List
在這里需要注意的是可以點(diǎn)擊黃色劃線處來更改數(shù)據(jù)排序,右側(cè)會(huì)顯示創(chuàng)建這項(xiàng)數(shù)據(jù)時(shí)的方法堆棧。

點(diǎn)擊橙色處則是過濾選項(xiàng),光看選項(xiàng)名字其實(shí)是有些猜不懂意思,但鑒于小果果“優(yōu)秀”的交互設(shè)計(jì),用戶把鼠標(biāo)指針停留一會(huì)會(huì)自動(dòng)顯示選項(xiàng)的詳細(xì)顯示(設(shè)計(jì)真優(yōu)秀的話就不會(huì)取這么難懂的名字了)。

解釋這三種選項(xiàng):
- All Allocations:所有
- Created & Persistent:顯示所選時(shí)間范圍內(nèi),結(jié)束時(shí)仍然存在的分配情況。
- Created & Destroyed:顯示所選時(shí)間范圍內(nèi),結(jié)束時(shí)已經(jīng)不存在的分配情況。
這個(gè)選項(xiàng)個(gè)人也是經(jīng)常用到的,因?yàn)槲覀兛磧?nèi)存一般會(huì)選定一段內(nèi)存開始分配到應(yīng)該釋放的時(shí)間段進(jìn)行觀察,這樣過濾掉之后會(huì)發(fā)現(xiàn)有哪些內(nèi)存數(shù)據(jù)在這個(gè)階段應(yīng)該釋放但沒有釋放的問題(甚至對(duì)于編譯器來講都不算內(nèi)存泄露)。
Call Trees
這里主要是從方法的角度來統(tǒng)計(jì)內(nèi)存占用的空間,每一條數(shù)據(jù)都對(duì)應(yīng)著一個(gè)方法,同時(shí)可以通過Bytes Used說明總占用內(nèi)存空間,用Count表示總共調(diào)用此方法的次數(shù)。

在看的時(shí)候我其實(shí)還推薦在列表中右鍵,增加顯示兩組數(shù)據(jù):Self Bytes和Self %,這樣看到是否當(dāng)前方法是否占用內(nèi)存,還是要再往深處尋找。

和上一節(jié)一樣,右側(cè)能看到詳細(xì)的方法堆棧,橙色劃線的選項(xiàng)功能也在上節(jié)介紹過,這里不再贅述。在這里還需要關(guān)注的是紅色劃線的Call Tree這個(gè)過濾選項(xiàng)。

五個(gè)選項(xiàng)一般能用到的就這三個(gè):
- Separate by Thread: 按照線程分類,比如向查看主線程是否任務(wù)過于繁重時(shí)可以用上
- Invert Call Tree: 反向顯示樹
- Hide System Libraries: 隱藏系統(tǒng)庫(kù),很多方法會(huì)最終調(diào)用到系統(tǒng)方法內(nèi),而很多系統(tǒng)方法內(nèi)接著沒完沒了地向下調(diào)用系統(tǒng)方法,我們開發(fā)者一般對(duì)此不會(huì)太感興趣(問題真出在系統(tǒng)方法里面也沒法改),一般會(huì)先選上。
Generations限于篇幅原因姑且略過,其實(shí)也是十分有用的機(jī)制。它通過在時(shí)間軸增加節(jié)點(diǎn),然后能返回到上一個(gè)時(shí)間節(jié)點(diǎn)之間出現(xiàn)的內(nèi)存分配。另外提醒有心人,節(jié)點(diǎn)是是時(shí)間軸上的小旗子,并且可以移動(dòng)小旗子更改標(biāo)記的時(shí)間點(diǎn)
實(shí)踐:內(nèi)存圖分享至Instruments
其實(shí)這一節(jié)的內(nèi)容才是讓我萌生寫文章的動(dòng)機(jī),畢竟我們?nèi)粘i_發(fā)場(chǎng)景時(shí)debug中才能遇到了內(nèi)存暴漲之類的問題,這個(gè)時(shí)候我們才想去修理內(nèi)存,debug時(shí)檢查內(nèi)存一般會(huì)點(diǎn)擊Debug Memory Graph。

這里可以看到各種變量之間的引用關(guān)系,對(duì)于查找循環(huán)引用會(huì)十分直觀,但是如果我們遇到問題是想找內(nèi)存暴漲問題原因的話就十分困難。
解決的方法是點(diǎn)擊上圖中紅線位置的分享按鈕,然后選擇Instruments。

于是來到了熟悉的界面。

你可以在這個(gè)基礎(chǔ)上繼續(xù)查找內(nèi)存的問題,而且提醒一下,如果你還沒有中斷剛才的debug的話,你可以在這個(gè)界面里把感興趣的內(nèi)存地址復(fù)制回Xcode,在內(nèi)存圖的角度繼續(xù)檢查。
總結(jié)
這次對(duì)Xcode的內(nèi)存調(diào)試工具做了進(jìn)一步的學(xué)習(xí),同時(shí)解決了我一個(gè)疑惑:內(nèi)存圖可以從引用的維度調(diào)試問題,但應(yīng)該如何銜接到Instruments繼續(xù)研究,畢竟看問題的角度不應(yīng)該只有一個(gè)。
本文來自博客園,作者:MrYu4,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/MrYU4/p/18262471/xcode-tiao-shi-nei-cun-zui-xin-li-jie

浙公網(wǎng)安備 33010602011771號(hào)