這期換個法吧,無規(guī)則有主題彼乌,發(fā)個關(guān)于Instruments的合集泻肯。Instruments是我們查找問題和調(diào)做強不可缺少的工具渊迁,也很強大。所有抽時間把文檔擼了一遍灶挟,寫了幾條知識小集琉朽,不過還有些沒發(fā)出來。這期先把之前發(fā)的整理整理吧稚铣,主要有以下5個問題:
使用Instruments檢測僵尸對象箱叁;
Xcode的Debug navigator中打開Instruments;
Instruments無線Profile惕医;
Instruments訪問多次運行的跟蹤數(shù)據(jù)
Abandoned Memory和Generational Analysis
Instruments為我們提供了一個檢測僵尸對象的工具:Zombies耕漱。使用這個工具時,將會自動開啟Enable Zombie Objects模式抬伺,而不需要我們自己手動去設(shè)置螟够。
我們以下圖這段簡單的代碼為例,點擊Product->Profile沛简,啟動Instrument齐鲤。
如下圖所示,我們可以看到”Zombies”這個工具椒楣「迹基本操作和其它工具一樣,啟動后點擊工具欄上的紅色按鈕來啟動程序捧灰。
在程序運行期間淆九,如果定位到僵尸對象,則會彈出一個提示對話框毛俏,如下圖所示炭庙。
我們可以點擊對話框右側(cè)的箭頭來定位到具體的代碼及調(diào)用棧,如下圖所示煌寇。
雙擊調(diào)用棧對應(yīng)的方法后焕蹄,還可以查看具體的代碼,如下圖所示阀溶。
實際上腻脏,我們用Allocations工具也可以檢測僵尸對象,如下圖所示银锻。
我們在屬性面板中勾選”Enable NSZombie detection”永品,其效果和單獨使用Zombies工具是一樣的。
Xcode的Debug navigator中打開Instruments
Xcode的Debug navigator中提供了幾個計量器來幫助我們跟蹤程序的性能击纬,包括CPU鼎姐、內(nèi)存、電量等。如圖1和2所示炕桨。
在每個計量器的詳情面板中的右上角饭尝,都提供了一個Profile in Instruments按鈕,如圖2所示(Energy Impact除外谋作,其在面板詳情中有幾個按鈕直接打開Instruments指定的模板芋肠,如下圖所示),這些按鈕可以讓我們直接跳轉(zhuǎn)到Instruments中遵蚜。
在點擊這些按鈕時帖池,會彈出一個提示框,提示“Transfer current debug session?”吭净,下面三個按鈕睡汹,如下圖所示。
Transfer會在程序當前的運行狀態(tài)中直接切換到Instruments寂殉,然后繼續(xù)跟蹤程序的運行狀態(tài)囚巴;而Restart則是關(guān)閉當前運行的程序,重新開始一次新的Profile友扰。
不過彤叉,這兩種情況都會關(guān)閉當前的性能分析(profiling),啟動Instruments村怪,初始一個新的性能分析秽浇。
Instruments支持無線的Profile,即設(shè)備不需要通過Lighting線連接到Mac電腦甚负,即可進行性能分析柬焕。這對于需要使用加速器或者外接配件的應(yīng)用來說非常有用。如下圖所示梭域。
不過要使用此功能斑举,需要滿足兩個條件:設(shè)備必須是注冊過的開發(fā)設(shè)備;無線網(wǎng)絡(luò)必須支持Bonjour和多路廣播(multicast)病涨。
當然富玷,還需要做一些基本配置,可參考Instruments User Guide:Target Devices and Processes既穆。
上周五搗鼓了一會赎懦,木有成功,后來發(fā)現(xiàn)是網(wǎng)絡(luò)不支持循衰。
Instruments訪問多次運行的跟蹤數(shù)據(jù)
Instruments在一次運行期間可以記錄App的多次運行記錄。以Allocations為例褐澎,開啟Instruments后会钝,每結(jié)束一次Allocations分析,這條分析就會被記錄下來,下次再開啟分析時迁酸,我們?nèi)匀豢梢钥吹角耙淮畏治龅男畔⑾扔悖缦聢D所示。
通過這些記錄奸鬓,我們可以對比每次分析的差別焙畔。這樣我們就可以邊修改程序,邊用Instruments來對其進行分析串远,并通過這種對比來觀察修改的效果宏多。
當然,關(guān)閉Instruments時澡罚,如果不保存信息伸但,這些記錄會被清理掉。
Instruments User Guide:Navigate the Timeline Pane
Abandoned Memory和Generational Analysis
說到內(nèi)存問題留搔,我們更多的會想到內(nèi)存泄露和野指針更胖,而實際上還有一類看似不是問題的內(nèi)存問題:Abandoned Memory(被遺棄的內(nèi)存)。這類內(nèi)存可能由于某些原因被分配隔显,但并非一直需要却妨,只是可能在程序運行期的某個時間需要,如內(nèi)存緩存的圖片括眠,還有一個比較普遍的東西–單例彪标。
我們可能會為某個模塊創(chuàng)建一個單例對象來維護這個模塊所需要的數(shù)據(jù),但在退出模塊后哺窄,這個單例對象依然存在捐下。與內(nèi)存泄露不同,這些對象從技術(shù)上講依然是有效的萌业。但實際上可能在程序后續(xù)的運行中不會再被使用坷襟。
使用Instruments定位內(nèi)存問題,內(nèi)存泄露和野指針的定位相對來說容易些生年,內(nèi)存泄露使用Leaks婴程,野指針則可以使用僵尸對象。而Abandoned Memory則相對不那么明顯抱婉。Abandoned Memory可以采用所謂的Generational Analysis方法來分析档叔,即反復(fù)進入退出某一場景,查看內(nèi)存的分配與釋放情況蒸绩,以定位哪些對象是屬于Abandoned Memory的范疇衙四。
在Allocations工具中,有專門的Generational Analysis設(shè)置患亿,如下圖所示传蹈。
我們可以在程序運行時押逼,在進入某個模塊前標記一個Generation,這樣會生成一個快照惦界。然后進入挑格、退出,再標記一個Generation沾歪,如下圖所示漂彤。
在詳情面板中我們可以看到兩個Generation間內(nèi)存的增長情況,其中就可能存在潛在的被遺棄的對象灾搏,如下圖所示挫望。定位到問題,即可做相應(yīng)的優(yōu)化确镊。
參考
Instruments是一個強大的分析工具士骤,其基于DTrace,為我們提供了豐富的功能蕾域。在實際開發(fā)中拷肌,采用正確的姿式來使用Instruments,可以幫我們提高程序的性能旨巷、穩(wěn)定性等巨缘。相信大家都經(jīng)常用三件套:Time Profile、Allocations采呐、Leaks若锁。當然,其它還有很多模板斧吐,也可以多去試試又固。
轉(zhuǎn)自?南峰子的技術(shù)博客