logo头像

星星給予仰望者光芒

Xcode 中斷點 簡介

本文于 1583 天之前發表,文章内容可能已經過時。

Xcode 中斷點 一些簡單的介紹

中斷點

中斷點(breakpoint)除了普通的中斷外,還有五種特殊的形式:

  1. Exception Breakpoint:程式碼出現問題,拋出異常時觸發。
  2. Symbolic Breakpoint:當執行某個符號時觸發。
  3. OpenGL ES Error Breakpoint:在 OpenGL ES 錯誤發生時觸發。
  4. Test Failure Breakpoint:測試斷言失敗的時候觸發。
  5. Swift Error Breakpoint:在 Swift 錯誤發生時觸發。

普通中斷點:

Condition:返回一個布林值,只有在布林值為 true 時才會觸發
Ignore:忽略前 n 次斷點,直到第 n+1 次遇到斷點才觸發。
Action:斷點觸發時,Xcode 執行的操作,如腳本等。

  • AppleScript:用於執行腳本,如 display dialog “SwiftGO” 彈出對話框。
  • Capture GPU Frame:攔截在斷點處 GPU 當前繪製的幀圖,用於 OpenGL ES 應用的調適。
  • Debugger Command:相當於在控制台中輸入的 lldb 調適指令。
  • Log Message:將自定義格式、内容的信息輸出到控制台,常用的占位符有:
    %H(斷點第幾次觸發),%B(斷點所在的方法的名字) 和 @expr@(輸出expr的值)。
  • Shell Command:接收命令文件以及相應的參數列表。Xcode 會異步執行 ShellCommand。
    勾選 “Waituntildone” 表示等待 Shell 命令執行结束後再執行調適工作。
  • Sound:觸發斷點的同時播放聲音。
  • Automatically continue after evaluating actions:勾選這個選項後,斷點不會中斷程式運行。

Swift Error Breakpoint:

拋出一個繼承自 ErrorType 類型的錯誤時會觸發這個中斷點。

1
2
3
4
5
6
7
8
9
10
11
12
13
enum ThisPersonError: ErrorType {
case IsDead
}

func findSomeone(name: String) throws {
if name == "xx" {
throw ThisPersonError.IsDead // 這裡將觸發中斷點
}
}

do {
try findSomeone("xx")
}

通過編輯 Swift Error Breakpoint,可以指定響應什麼類型的異常。

Exception Breakpoint:

只在 Objective-C 或 C++ 中有用。比如下面這段程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
int main(int argc, const char * argv[]) {
@autoreleasepool {
@try {
// 打斷點後,程式在下一行程式碼中斷
@throw [NSException exceptionWithName:@"名字" reason:@"原因" userInfo:nil];
}
@catch (NSException *exception) {
NSLog(@"catch斷點");
}
}
return 0;
}

如果不添加 Exception Breakpoint,會執行到 @catch程式碼區域。這種斷點的編輯界面和以前不太一樣:

  • Exception: 表示響應哪種語言的異常,可以是 Objective-C 或 C++
  • Break:是在 throw 還是在 catch 中觸發這個異常

Symbolic Breakpoint:

符號斷點會在某個方法被調用時觸發:
如定義這樣的兩個函數:

1
2
3
4
5
6
7
func burnAllCouples() {
print("FFF Couples")
}

func burnAllSingleDogs() {
print("FFF Single Dogs")
}

然後把 Symbol 設置成某個函數的名字:burnAllSingleDogs,這樣每次調用 burnAllSingleDogs 函數都會觸發這個中斷點
目前 Swift 中,Symbolic Breakpoint 一個比較大的問題是它不支持帶參數的方法名。

Test Failure Breakpoint

這在測試的斷言失敗時觸發:

1
2
3
4
5
func testExample() {
XCTAssert(1 == 0)
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}

如這個測試斷言必定失敗,添加 Test Failure Breakpoint 後,程式將在 XCTAssert(1 == 0) 處中斷。