最全面的 iOS 斷點調(diào)試

作為一名程序猿,編碼能力是賴以生存的基礎。編碼是個人邏輯的提現(xiàn),正所謂「智者千慮,必有一失」,幾乎沒有人能夠保證自己的程序完全正確,因此在編程工作中,代碼調(diào)試工具顯得異常重要。Xcode 中集成了調(diào)試工具神器 lldb ,利用它能夠輕松發(fā)現(xiàn)代碼中隱藏的錯誤。本篇文章對其做一個全面的介紹。

Xcode 中添加斷點十分簡單,單擊左側(cè)代碼行,出現(xiàn)藍色標簽,就是添加了一個斷點:


1.png

接下來,看一下斷點的晉級操作:

1 ctrl + 斷點/右鍵斷點,調(diào)出斷點編輯菜單:

2.png

點擊 Edit Breakpoint 調(diào)出斷點編輯的子菜單:
3.png

1 處的 Condition 輸入 Boolean 表達式, 控制斷點觸發(fā)的條件;
2 處表示忽略斷點執(zhí)行的次數(shù);
3 處用來添加斷點觸發(fā)時,附加動作,分為六種:AppleScript ,Capture GPU Frame, Debugger Command, Log Message, Shell Command 和 Sound;
3.1 添加 Log 輸出信息:

4.png

參數(shù)說明如下:

1 %B :輸出斷點處函數(shù)的名稱
2 %H :輸出斷點執(zhí)行的次數(shù)
3 @@ :之間輸入表達式
4 勾選復選框,在斷點觸發(fā)時,程序繼續(xù)運行;

3.2 添加 lldb 命令:

lldb 命令

常用的命令包括:
1 po : 類似 Console 中 po 命令;
2 bt : 函數(shù)調(diào)用堆棧信息;
3 expression : 修改變量值;簡稱 p / e
4 script : 進入 python 腳本程序;
5 facebook 中基于基于 lldb 支持 python 語言支持的特性,開源了自己更詳細的 debug 項目: chisel
6 br / breakpoint list: 列出所有斷點;
7 thread backtrace: 獲取當前線程的調(diào)用棧;
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)控制調(diào)試:

c/continue:繼續(xù) 
next/n: 下一步 
step/s: 進入 
finish/f: 跳出

可以參照 Xcode 圖形化界面理解:


6.png
1 啟用、禁用斷點調(diào)試
2 繼續(xù)執(zhí)行
3 單步執(zhí)行
4 進入函數(shù)
5 跳出函數(shù)
6 UI調(diào)試
7 選擇線程

11 thread return: 控制函數(shù)返回值, 直接跳過本函數(shù);

添加其他類型的斷點:
7.png
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

根據(jù)字符添加斷點。比如添加如下斷點:


1.png

在項目中所有名稱為 btn_leftClick 的函數(shù)處, 將會自動添加斷點。

5 Constraint Error Breakpoint

添加斷點之后,使用 Autolayout 故意設置約束沖突,沒有打印任何效果。這種斷點類型,使用較少。

6 Test Failure Breakpoint

單元測試全局斷點。添加后,在單元測試 XCAssert 斷言失敗時,停留在函數(shù)處。此時可以用 lldb 命令 p 強制修改條件滿足斷言后,繼續(xù)調(diào)試運行。

以上是 iOS 代碼調(diào)試中,能夠應用到的各種命令介紹。其中對調(diào)試過程中的 lldb 命令,進行了較為詳細的介紹。對全局斷點,進行了分類簡介,基本涵蓋了日常編程中用到的場景。lldb 中較為詳細的命令參數(shù),Constraint Error Breakpoint 的詳細使用情況,可以參考蘋果的官方文檔。如果使用過程中,有疑問之處,歡迎留言交流。

參考:
1 iOS Xcode Breakpoint(斷點)調(diào)試
2 iOS-斷點設置(調(diào)試程序)
3 官方 lldb 文檔
4 iOS調(diào)試
5 OpenGLES_ProgrammingGuide

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • LLDB的Xcode默認的調(diào)試器,它與LLVM編譯器一起,帶給我們更豐富的流程控制和數(shù)據(jù)檢測的調(diào)試功能。平時用Xc...
    小笨狼閱讀 20,803評論 31 186
  • ??LLDB的Xcode默認的調(diào)試器,它與LLVM編譯器一起,帶給我們更豐富的流程控制和數(shù)據(jù)檢測的調(diào)試功能。平時用...
    Thinkdifferents閱讀 1,951評論 1 4
  • [轉(zhuǎn)]淺談LLDB調(diào)試器文章來源于:http://www.cocoachina.com/ios/20150126/...
    loveobjc閱讀 2,728評論 2 6
  • 你是否曾經(jīng)苦惱于理解你的代碼,而去嘗試打印一個變量的值? NSLog(@"%@", whatIsInsideThi...
    F麥子閱讀 1,294評論 1 2
  • 你是否曾經(jīng)苦惱于理解你的代碼,而去嘗試打印一個變量的值? NSLog(@"%@", whatIsInsideThi...
    paraneaeee閱讀 1,321評論 0 7

友情鏈接更多精彩內(nèi)容