天天看點

iOS開發 - XCode設定斷點與編輯斷點

iOS開發 - XCode設定斷點與編輯斷點

iOS開發 - XCode設定斷點與編輯斷點

編碼不能沒調試,調試不能沒斷點(Break Point)。XCode的斷點功能也是越來越強大。

基本斷點

如下圖,這種是最常用的斷點,也是最容易設定。左鍵點選一下就可以設定。 

iOS開發 - XCode設定斷點與編輯斷點

編輯斷點

斷點是可以編輯的。

iOS開發 - XCode設定斷點與編輯斷點

斷點有下面幾個屬性可以設定:

  • Condition
  • Ignore
  • Action
  • Options

Condition

這裡可以輸入條件表達式,滿足條件的時候斷點就會生效。例如上面輸入a == 50。這個是非常有用的設定,特别在循環體内調試的時候,用着真的是爽。

Ingore

在這裡可以設定忽略斷點次數。

Action

Action是這裡最複雜的,最強大的功能了。Action有6中類型。如下圖

iOS開發 - XCode設定斷點與編輯斷點
  1. AppleScript
  2. Capture GPU Frame
  3. Debugger Command
  4. Log Message
  5. Shell Command
  6. Sound

常用的就是Log Message和Debugger Command

Log Message

在這裡填寫的東西可以列印到控制台。例如我做了如下設定:

iOS開發 - XCode設定斷點與編輯斷點

%B會列印斷點的名字,%H會列印斷點的調用次數,@@中間可以輸入表達式。 上面的設定在控制台的輸出如下:

iOS開發 - XCode設定斷點與編輯斷點

Debugger Command

這裡可以輸入調試指令,也就是po(列印對象資訊),bt(列印函數棧),expression(表達式)這些調試指令。看圖就明白了:

iOS開發 - XCode設定斷點與編輯斷點

image 控制台輸出如下:

iOS開發 - XCode設定斷點與編輯斷點

Options

勾選Automatically continue after evaluating actions之後程式會在斷點産生後繼續運作。這個屬性是相當有用的,可以輸入調試資訊至于不暫停程式。

出了上面的基本斷點外,XCode還提供了下面四種斷點,需要點選斷點面闆左下角的+号添加。

iOS開發 - XCode設定斷點與編輯斷點
  • Exception Breakpoint
  • OpenGL ES Error Breakpoint
  • Symbolic Breakpoint
  • Test Failure Breakpoint

Exception Breakpoint

Exception Breakpoint是一個非常有用的斷點項。正如名字所示,當程式抛出異常的時候就回産生斷點。通常程式崩潰會停在崩潰的地方,但有時候并不能準确停在引起異常的地方。比如數組越界!比如我下圖所示,會引起數組越界通路。 

iOS開發 - XCode設定斷點與編輯斷點
iOS開發 - XCode設定斷點與編輯斷點

程式運作的時候就會崩潰。但是崩潰停在了main函數裡面,就算看了棧資訊也不能馬上定位到到底是那個數組越界通路了。為什麼崩潰不能停在數組越界哪裡?這是因為數組越界通路不一定會導緻程式崩潰的,數組越界通路會導緻異常抛出,而抛出的異常沒有得到處理才會導緻程式崩潰。是以最後會導緻崩潰停在CoreFoundation架構裡面。這個時候就需要設定Exception Breakpoint産生斷點來定位錯誤了。

iOS開發 - XCode設定斷點與編輯斷點
iOS開發 - XCode設定斷點與編輯斷點

OpenGL ES Error Breakpoint

這個主要是OpenGL ES的斷點調試,這個個人沒用到過。

Symbolic Breakpoint

Symbolic Breakpoint,符号斷點,真的是調試神器啊。當程式運作到特定符号的時候就會産生斷點。通過這種方式添加斷點,就不需要在源檔案中添加,也不需要知道斷點設定在檔案的第幾行。如圖: 

iOS開發 - XCode設定斷點與編輯斷點

比普通斷點多了兩個屬性Symbol和Module。

Symbol

Symbol的内容,可以有如下幾種: 

1. 方法名稱:會對所有具有此方法名稱的類方法生效。例如 initWithFrame: 。 

2. 特定類的方法:OC類和C++類都适用,例如 ,[UIView initWithFrame:]或者 Shap::draw()。 

3. 函數名稱。例如普通C函數。

通過設定Symbol來調試,好用根本停不下來,想怎麼斷點就怎麼斷點。

Test Failure Breakpoint

這個類型的斷點會在test assertion 失敗的時候暫停程式的執行。