參考
[1] http://developer.apple.com/library/ios/#recipes/xcode_help-breakpoint_navigator/articles/about_breakpoint_navigator.html#//apple_ref/doc/uid/TP40010433-CH6-SW1
偵錯工具時,斷點是必不可少的工具,下面介紹一下斷點具體使用
1.普通斷點
如所示,在xcode編輯框左側點擊 就出現一個斷點,右擊出現 “編輯斷點”等選項。如中代碼所示,添加斷點後,每次for迴圈都會在NSLog 40行停住。
如果想在某一條件下 斷點才生效,則添加條件選項,右擊斷點,選擇編輯斷點,如所示,只有當item 為“three”時斷點才生效,中斷程式運行。
(BOOL)[item isEqualToString:@"three"] 前面的(BOOL)是必須的。否則console會提示類型不符號,導致條件不能生效。
從中可以看出,還可以設定忽略斷點次數,以及當斷點條件滿足時 要做的事情,圖中所示是
po item 輸出 item變數的值
bt 表示輸出 方法呼叫堆疊資訊
haha 表示用系統的PPS 語音讀出“haha”發音提示。
更多的gdb 或lldb命令,網上搜下,或者直接在命令列輸入help
當然條件斷點一般可以用以下方法替換
2.異常斷點(Exception breakpoint)
如下代碼所示,[mutDict setObject:value forKey:@"key"]; 會導致如下錯誤資訊,並且系統中斷在mian函數上,你雖然從錯誤資訊看出是 setObjectForKey 導致異常,但在一個工程中,用到setObjectForKey 可能有很多地方,你還是不能確定哪一行代碼導致的,這時就需要添加異常斷點。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: key)'
*** First throw call stack:
(0x1c8d012 0x10cae7e 0x1d100de 0x2ede 0x2fc8 0xf3817 0xf3882 0x42a25 0x42dbf 0x42f55 0x4bf67 0x296b 0xf7b7 0xfda7 0x10fab 0x22315 0x2324b 0x14cf8 0x1be8df9 0x1be8ad0 0x1c02bf5 0x1c02962 0x1c33bb6 0x1c32f44 0x1c32e1b 0x107da 0x1265c 0x2672
0x25a5)
libc++abi.dylib: terminate called throwing an exception
- (void)testExceptionBreakPoint{NSString* value = nil;NSMutableDictionary* mutDict = [NSMutableDictionary dictionaryWithCapacity:0];[mutDict setObject:value forKey:@"key"];}
添加異常斷點如下
異常斷點建議是全域的,即在User下面,儲存在Xcode的設定資訊中,以後建立任意工程時 該斷點都時有效。建立斷點後,右擊選擇“move breakpoint to ” 選擇 “User”即可。
再次運行程式後,可以很簡單的找到 [mutDict setObject:value
forKey:@"key"]; 之前的異常是這一行導致的。
3.符號斷點(symbolic breakpoint)
符號斷點 可以針對某一個方法設定斷點,不僅可以的是自己建立的類的方法,更重要的是系統SDK中的函數或方法也可以設定斷點。
比如為了在異常時設定斷點,我們知道系統會調用objc_exception_throw 函數,則只要建立 objc_exception_throw 的符號斷點,如下述所示。
運行後,如所示,也能輕鬆的找到 [mutDict setObject:value forKey:@"key"]; 這一行代碼導致異常,如使用異常斷點時一致。
如果想為自己的類方法 設定符號斷點也可以,如所示,為類BI_TestClass 類的執行個體方法 - (void)method:(id)obj 建立了 符號斷點,減號(-)表示執行個體方法,加號(+)表示類方法。那麼在每次調用該方法時都會中斷。當然你也可以直接在該方法中設定一個普通斷點達到相同效果。
特別注意:-[BI_TestClass method:] 不需要 在引號內,雖然它Example 的格式是需要包含在雙引號內的,坑爹的Example 導致我剛開始一直設沒有效果。
其他常用的符號斷點 -[NSObject doesNotRecognizeSelector:]