轉自
只會左鍵斷點?是時候試試這樣那樣斷點了
編碼不能沒調試,調試不能沒斷點(Break Point)。XCode的斷點功能也是越來越強大。
基本斷點
如下圖,這種是最常用的斷點,也是最容易設置。左鍵點擊一下就可以設置。
編輯斷點
斷點是可以編輯的。
斷點有下面幾個屬性可以設置:
-
Condition
-
Ignore
-
Action
-
Options
Condition
這里可以輸入條件表達式,滿足條件的時候斷點就會生效。例如上面輸入a == 50。這個是非常有用的設置,特別在循環體內調試的時候,用着真的是爽。
Ingore
在這里可以設置忽略斷點次數。
Action
Action是這里最復雜的,最強大的功能了。Action有6中類型。如下圖
-
AppleScript
-
Capture GPU Frame
-
Debugger Command
-
Log Message
-
Shell Command
-
Sound
常用的就是Log Message和Debugger Command
Log Message
在這里填寫的東西可以打印到控制台。例如我做了如下設置:
%B會打印斷點的名字,%H會打印斷點的調用次數,@@中間可以輸入表達式。 上面的設置在控制台的輸出如下:
Debugger Command
這里可以輸入調試命令,也就是po(打印對象信息),bt(打印函數棧),expression(表達式)這些調試命令。看圖就明白了:
image 控制台輸出如下:
Options
勾選Automatically continue after evaluating actions之后程序會在斷點產生后繼續運行。這個屬性是相當有用的,可以輸入調試信息至於不暫停程序。
出了上面的基本斷點外,XCode還提供了下面四種斷點,需要點擊斷點面板左下角的+號添加。
-
Exception Breakpoint
-
OpenGL ES Error Breakpoint
-
Symbolic Breakpoint
-
Test Failure Breakpoint
Exception Breakpoint
Exception Breakpoint是一個非常有用的斷點項。正如名字所示,當程序拋出異常的時候就回產生斷點。通常程序崩潰會停在崩潰的地方,但有時候並不能准確停在引起異常的地方。比如數組越界!比如我下圖所示,會引起數組越界訪問。
程序運行的時候就會崩潰。但是崩潰停在了main函數里面,就算看了棧信息也不能馬上定位到到底是那個數組越界訪問了。為什么崩潰不能停在數組越界哪里?這是因為數組越界訪問不一定會導致程序崩潰的,數組越界訪問會導致異常拋出,而拋出的異常沒有得到處理才會導致程序崩潰。因此最后會導致崩潰停在CoreFoundation框架里面。這個時候就需要設置Exception Breakpoint產生斷點來定位錯誤了。
OpenGL ES Error Breakpoint
這個主要是OpenGL ES的斷點調試,這個個人沒用到過。
Symbolic Breakpoint
Symbolic Breakpoint,符號斷點,真的是調試神器啊。當程序運行到特定符號的時候就會產生斷點。通過這種方式添加斷點,就不需要在源文件中添加,也不需要知道斷點設置在文件的第幾行。如圖:
比普通斷點多了兩個屬性Symbol和Module。
Symbol
Symbol的內容,可以有如下幾種:
1. 方法名稱:會對所有具有此方法名稱的類方法生效。例如 initWithFrame: 。
2. 特定類的方法:OC類和C++類都適用,例如 ,[UIView initWithFrame:]或者 Shap::draw()。
3. 函數名稱。例如普通C函數。
通過設置Symbol來調試,好用根本停不下來,想怎么斷點就怎么斷點。
Test Failure Breakpoint
這個類型的斷點會在test assertion 失敗的時候暫停程序的執行。