1. 程式人生 > >Xcode除錯方法彙總

Xcode除錯方法彙總

在開發當中我自己用到的最多的肯定是斷點除錯了,但是強大的Xcode顯然不止這麼一點除錯優化工具,這篇文章就用來記錄並分享我用的幾種方法:【本文持續更新,歡迎大家提出寶貴建議】

一、斷點除錯

【1.普通斷點】斷點(Breakpoint)絕對是除錯程式的第一大選擇,也是掌握的基礎技能。顧名思義,當程式執行到斷點處時會暫停執行。比如斷點打在11行,那麼程 序就會停在11行(注意:程式只執行到了前10行,第11行其實還沒有被執行!!!)。只要在程式碼行旁邊點選,就能新增一個斷點,再次點選,就能讓斷點不 可用(disable了,仍然存在,只是不起作用了)。在某一行建立斷點的快捷鍵是:command+\

此時斷點有效

此時斷點無效

並能在除錯過程中在下方看到引數的值:

除錯過程

注意:斷點除錯中還有一個經常用到的命令是po,用來列印物件資訊

【2.條件斷點】以上的斷點只是最普通的,我們還能對斷點的屬性進行配置,設定條件,使斷點更加智慧化,右鍵斷點進入編輯對話方塊:

在斷點上右鍵即可

我以一個迴圈作為測試程式碼:

簡單的一個for迴圈

迴圈中的程式碼每次都要單步執行,可能這並不是我想要的。我想要在i為3的時候中斷程式,進行除錯,編寫條件如下:

編寫條件

設定i==3的條件後,程式就會在該條件時中斷,而不會每次到達該位置都中斷。中斷時輸出如下:

斷點條件輸出

同時也可以設定Ignore引數,會忽略前面n次的斷點執行,會在第n+1次中斷。

設定引數

除錯輸出如下:

設定迴圈次數斷開

同時,還可以檢視某個函式被呼叫的次數,設定Action引數如下,注意要選中Automatically continue after evaluating actions.

檢視某個函式被呼叫的次數

輸出結果如下:
 

檢視某個函式被呼叫的次數

【3.異常斷點】斷點的功能不限於上面所述。開發iOS知道,如果我們因為異常然後程式crash了,程式碼就直接跑到main.m的main函式中去了。為什麼就不能跑到出現異常的程式碼中呢???異常斷點就為我們解決該問題,程式就會在異常出現的那行程式碼終止。建立異常斷點圖例如下:

異常斷點

如下所示就建立完成了。如果碰到異常crash時,嘗試使用異常斷點吧。

異常斷點

【4.符號斷點Symbolic Breakpoint】符號斷點的建立也同異常斷點。一般符號斷點可以在你指定的[類名 方法名]時中斷執行。【建立方法如上圖】
 

符號斷點Symbolic Breakpoint

配置符號斷點如下:可以當執行到ViewController類的viewDidLoad方法時中斷執行。

配置符號斷點

如果你的Symbol只寫了一個函式名,那麼就會在出現該函式名的地方就中斷執行。如下,就會在執行到doAnimation的時候中斷。是不是很強大呢?

以上為斷點除錯,歡迎大家補充指正,下面介紹另外的幾種除錯:

二、檢視除錯

如今iOS開發的UI設計有很多種方式,比如storyboard,xib,程式碼實現。對於stoayboard,xib視覺化實現是比較簡單的, 但是對於一些“iOS老程式設計師”而言,都喜歡使用程式碼實現UI,並且可能UI層次還比較複雜。這樣就給我們新接手專案的開發者帶來很多困擾。如何快速檢視 一個複雜UI的介面層次和佈局,最快的方法就是用到檢視除錯。

開啟檢視除錯的方法

當專案執行到某一個介面(可以是模擬器或真機)時,開啟檢視除錯,點選按鈕如圖:這樣就會進入試圖除錯,你可以很方便的檢視這個介面。這裡可以看到控制元件之間的層次關係。

可以利用兩個藍色的進度條來增大角度和過濾部分檢視,也可以直接拖拽旋轉檢視

左側的樹形層次圖可以在檢視執行緒、佇列和UI之間切換:

這裡也可以看到系統控制元件的結構

可以通過選中左側控制元件名稱就可以在右側看到控制元件的位置【藍色加深部分】,只要控制元件存在大小,並且已經新增到檢視範圍內,就會在右側顯示。

三、殭屍物件

iOS中把那些已經release但還沒完全消失的物件叫做殭屍物件,對已經release的物件再次釋放,就會發生異常。雖然自從使用ARC後, 由於物件釋放產生的異常已經大大變少,但偶爾還會出現。開啟殭屍物件模式後,就能快速定位到異常位置。開啟方式如 下:Product-->Scheme-->Edit Scheme.. 勾選Enable Zombie Objects即可。

這裡再加一個工具就是Analyze分析器,Analyze分析器是一種靜態的工具,可以對我們的程式進行分析,找出我們未使用的變數,或一些死儲存。執行Analyze如下:Product-->Analyze. 如下藍色的標記就是靜態分析的結果。

分析結果

當然,我們可以設定在編譯程式的時候同時Analyze,把下列選項設為Yes即可。

 

但是我一般不這麼做可能是寫程式碼習慣的問題吧,我通常是寫完了之後再使用分析器分析,不僅可以分析出哪裡的變數未使用,還可以分析出哪裡可能為空造成異常,開啟分析器快捷鍵command + shift + b

四、Instruments中leaks工具除錯記憶體洩漏

【1.leaks工具】Instruments這個裡面的工具真的太牛了,我目前也只掌握了兩種,以後還有會用的會再到這裡更新。
靜態分析器Analyze並不能分析出程式碼裡所有的記憶體問題,比如說有時候記憶體洩漏是在使用者操作的時候才產生的,這個時候就需要用到leaks工具來進行除錯了,可以在這裡找到Instruments

第一個就是了

開啟後是這個樣子

圖1

先選中leaks然後點選choose就可以打開了,開啟後是這樣:
 

這裡的意思是在iPhone7 plus上執行你的工程進行測試,可能你第一次開啟那裡選擇的 my mac,你可以像選擇模擬器一樣的點選選擇你要的裝置,這裡不要選真機,否則你會看不到你的程式碼!!無法修改,迴歸正題,這裡選好了裝置和工程之後點選紅色的點執行,像正常操作一樣把每一個步驟都實驗一下,如果你看到Allocations那行有出現紅色菱形就代表那一塊有記憶體洩露了。這個時候點選停止按鈕

然後下一步就可以看程式碼了:

注意要選擇的選項

你只要在這些方法上雙擊,就會跳轉到具體的程式碼,進入到程式碼去之後會這樣:

這個是網上找的MRC環境下的一個例子

這裡應該是提示100%記憶體會洩露。所以就著重在這裡查程式碼了,因為記憶體洩漏可能會很大程度的影響程式的穩定性!!

【2.Time Profiler工具
Time Profiler分析原理:它按照固定的時間間隔來跟蹤每一個執行緒的堆疊資訊,通過統計比較時間間隔之間的堆疊狀態,來推算某個方法執行了多久,並獲得一個近似值。其實從根本上來說與我們的原始分析方法異曲同工,只不過其將各個方法消耗的時間統計起來,同樣是從Instruments中開啟。
選擇Time Profiler工具開始測試,這時會自動啟動模擬器和Time Profiler錄製。
先進行一些App的操作,讓Time Profiler收集足夠的資料,尤其是你覺得那些有效能瓶頸的地方。

4、5、6所標記的面板是需要關注的:
4是擴充套件面板,用來跟蹤顯示堆疊;5是詳細地面板,可以從這裡看到cpu執行的時間都消耗在哪裡;6是選項面板,可以用來設定Time Profiler的執行引數。
通過對應用的操作,可以在詳細面板中看到那些最耗時的操作是哪些,並可以逐行展開檢視:

圖示為黑色頭像的就是Time Profiler給我們的提示,有可能存在效能瓶頸的地方,可以逐漸向下展開,找到產生的根本原因。
比如我們通過分析,發現[CMTool getNewsTimeFromLong]這個時間格式化函式可能需要優化。

當然這裡只是舉一個例子,效能調優應該首先從整體到細節的順序進行,才能收到最明顯的效果。Time Profiler引數設定:

這裡邊幾個選項的含義如下:
Separate by Thread: 每個執行緒應該分開考慮。只有這樣你才能揪出那些大量佔用CPU的"重"執行緒
Invert Call Tree:
從上倒下跟蹤堆疊,這意味著你看到的表中的方法,將已從第0幀開始取樣,這通常你是想要的,只有這樣你才能看到CPU中話費時間最深的方法.也就是說FuncA{FunB{FunC}}
勾選此項後堆疊以C->B-A 把呼叫層級最深的C顯示在最外面

Hide Missing Symbols: 如果dSYM無法找到你的app或者系統框架的話,那麼表中看不到方法名只能看到十六進位制的數值,如果勾線此項可以隱藏這些符號,便於簡化資料

Hide System Libraries: 勾選此項你會顯示你app的程式碼,這是非常有用的. 因為通常你只關心cpu花在自己程式碼上的時間不是系統上的

Show Obj-C Only: 只顯示oc程式碼 ,如果你的程式是像OpenGl這樣的程式,不要勾選側向因為他有可能是C++的

Flatten Recursion: 遞迴函式, 每個堆疊跟蹤一個條目

Top Functions:
一個函式花費的時間直接在該函式中的總和,以及在函式呼叫該函式所花費的時間的總時間。因此,如果函式A呼叫B,那麼A的時間報告在A花費的時間加上B花費的時間,這非常真有用,因為它可以讓你每次下到呼叫堆疊時挑最大的時間數字,歸零在你最耗時的方法。
上面的引數在實踐中合理設定,也沒有什麼太多技巧,就是通過資料的隱藏、顯示讓我們更關注於想找到的資料。

目前先就寫這些吧,寫這篇文章只是想把我平時看到的一些知識以及自己的一些體會通過這樣的方式集中整理複習一下,這樣以後會更加方便熟練。


instruments除錯部分參照自:http://www.cnblogs.com/ym123/p/4324335.html
其中斷點除錯部分參照自:http://www.cnblogs.com/gongyuhonglou/p/5806433.html



作者:東健FO_OF
連結:https://www.jianshu.com/p/98a776e54bbe
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。