作為一名程序猿剥槐,編碼能力是賴以生存的基礎。編碼是個人邏輯的提現(xiàn)疚鲤,正所謂「智者千慮锥累,必有一失」,幾乎沒有人能夠保證自己的程序完全正確集歇,因此在編程工作中桶略,代碼調試工具顯得異常重要。Xcode 中集成了調試工具神器 lldb 诲宇,利用它能夠輕松發(fā)現(xiàn)代碼中隱藏的錯誤际歼。本篇文章對其做一個全面的介紹。
Xcode 中添加斷點十分簡單姑蓝,單擊左側代碼行鹅心,出現(xiàn)藍色標簽,就是添加了一個斷點:
接下來纺荧,看一下斷點的晉級操作:
1 ctrl + 斷點/右鍵斷點旭愧,調出斷點編輯菜單:
點擊 Edit Breakpoint 調出斷點編輯的子菜單:
1 處的 Condition 輸入 Boolean 表達式颅筋, 控制斷點觸發(fā)的條件;
2 處表示忽略斷點執(zhí)行的次數(shù)输枯;
3 處用來添加斷點觸發(fā)時议泵,附加動作,分為六種:AppleScript 桃熄,Capture GPU Frame, Debugger Command, Log Message, Shell Command 和 Sound;
3.1 添加 Log 輸出信息:
參數(shù)說明如下:
1 %B :輸出斷點處函數(shù)的名稱
2 %H :輸出斷點執(zhí)行的次數(shù)
3 @@ :之間輸入表達式
4 勾選復選框先口,在斷點觸發(fā)時,程序繼續(xù)運行瞳收;
3.2 添加 lldb 命令:
常用的命令包括:
1 po : 類似 Console 中 po 命令碉京;
2 bt : 函數(shù)調用堆棧信息;
3 expression : 修改變量值螟深;簡稱 p / e
4 script : 進入 python 腳本程序谐宙;
5 facebook 中基于基于 lldb 支持 python 語言支持的特性,開源了自己更詳細的 debug 項目: chisel
6 br / breakpoint list: 列出所有斷點血崭;
7 thread backtrace: 獲取當前線程的調用棧卧惜;
8 thread list:列出所有的線程;
9 target stop-hook :
9.1 在每次 stop 的時候去執(zhí)行一些命令;例如:
(lldb) target stop-hook add -o "frame variable”
,在每次 stop 時夹纫,執(zhí)行 frame variable 命令咽瓷;
9.2 target stop-hook list: 列出 hook 的所有斷點;
9.3 target stop-hook del 編號: 刪除 hook 的斷點舰讹;
10 命令行實現(xiàn)控制調試:
c/continue:繼續(xù)
next/n: 下一步
step/s: 進入
finish/f: 跳出
可以參照 Xcode 圖形化界面理解:
1 啟用茅姜、禁用斷點調試
2 繼續(xù)執(zhí)行
3 單步執(zhí)行
4 進入函數(shù)
5 跳出函數(shù)
6 UI調試
7 選擇線程
11 thread return: 控制函數(shù)返回值, 直接跳過本函數(shù);
添加其他類型的斷點:
1 Swift Error Breakpoint
Swift 全局斷點月匣,和 Exception Breakpoint 斷點類似钻洒。
2 Exception Breakpoint
Object-C 全局斷點。添加全局斷點锄开,比如在數(shù)組越界時素标,會打印如下信息:
***** Terminating app due to uncaught exception 'NSRangeException'**, **reason: '*** -**[**__NSArray0 objectAtIndex:**]**: index 1 beyond bounds for empty NSArray'**
但是并不能準確定位具體數(shù)組位置。添加全局斷點后萍悴,斷點能夠準確在越界數(shù)組處 stop.
3 OpenGL ES Error Breakpoint
OpenGL是用于2D/3D圖形編程的一套基于C語言的統(tǒng)一接口头遭,在桌面windows,Mac癣诱,Linux/Unix上均可兼容计维。OpenGL ES是在OpenGL嵌入式設備上面的版本,也就是安卓/iPhone撕予,其他嵌入式等移動設備的編程規(guī)范鲫惶。(除此之外,在web上也有相應的WebGL)
現(xiàn)在在iOS平臺上目前支持的OpenGL版本有
OpenGL1.0/OpenGL2.0/OpenGL3.0
实抡,在使用 cocoa 框架中 OpenGL 類庫繪制 2D/3D 圖像時欠母,可以使用該選項添加斷點欢策。
4 Symbolic Breakpoint
根據字符添加斷點。比如添加如下斷點:
在項目中所有名稱為 btn_leftClick 的函數(shù)處赏淌, 將會自動添加斷點猬腰。
5 Constraint Error Breakpoint
添加斷點之后,使用 Autolayout 故意設置約束沖突猜敢,沒有打印任何效果。這種斷點類型盒延,使用較少缩擂。
6 Test Failure Breakpoint
單元測試全局斷點。添加后添寺,在單元測試 XCAssert 斷言失敗時胯盯,停留在函數(shù)處。此時可以用 lldb 命令 p 強制修改條件滿足斷言后计露,繼續(xù)調試運行博脑。
以上是 iOS 代碼調試中,能夠應用到的各種命令介紹票罐。其中對調試過程中的 lldb 命令叉趣,進行了較為詳細的介紹。對全局斷點该押,進行了分類簡介疗杉,基本涵蓋了日常編程中用到的場景。lldb 中較為詳細的命令參數(shù)蚕礼,Constraint Error Breakpoint
的詳細使用情況烟具,可以參考蘋果的官方文檔。如果使用過程中奠蹬,有疑問之處朝聋,歡迎留言交流。
參考:
1 iOS Xcode Breakpoint(斷點)調試
2 iOS-斷點設置(調試程序)
3 官方 lldb 文檔
4 iOS調試
5 OpenGLES_ProgrammingGuide