最全面的 iOS 斷點調試

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

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


1.png

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

1 ctrl + 斷點/右鍵斷點旭愧,調出斷點編輯菜單:

2.png

點擊 Edit Breakpoint 調出斷點編輯的子菜單:
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ù)調用堆棧信息;
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 圖形化界面理解:


6.png
1 啟用茅姜、禁用斷點調試
2 繼續(xù)執(zhí)行
3 單步執(zhí)行
4 進入函數(shù)
5 跳出函數(shù)
6 UI調試
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

根據字符添加斷點。比如添加如下斷點:


1.png

在項目中所有名稱為 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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末囤躁,一起剝皮案震驚了整個濱河市冀痕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌割以,老刑警劉巖金度,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異严沥,居然都是意外死亡猜极,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門消玄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跟伏,“玉大人丢胚,你說我怎么就攤上這事∈馨猓” “怎么了携龟?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長勘高。 經常有香客問我峡蟋,道長,這世上最難降的妖魔是什么华望? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任蕊蝗,我火速辦了婚禮,結果婚禮上赖舟,老公的妹妹穿的比我還像新娘蓬戚。我一直安慰自己,他們只是感情好宾抓,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布子漩。 她就那樣靜靜地躺著,像睡著了一般石洗。 火紅的嫁衣襯著肌膚如雪幢泼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天讲衫,我揣著相機與錄音旭绒,去河邊找鬼。 笑死焦人,一個胖子當著我的面吹牛挥吵,可吹牛的內容都是我干的。 我是一名探鬼主播花椭,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼忽匈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了矿辽?” 一聲冷哼從身側響起丹允,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袋倔,沒想到半個月后雕蔽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡宾娜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年批狐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嚣艇,死狀恐怖承冰,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情食零,我是刑警寧澤困乒,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站贰谣,受9級特大地震影響娜搂,放射性物質發(fā)生泄漏。R本人自食惡果不足惜吱抚,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一涌攻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧频伤,春花似錦、人聲如沸芝此。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婚苹。三九已至岸更,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膊升,已是汗流浹背怎炊。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留廓译,地道東北人评肆。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像非区,于是被迫代替她去往敵國和親瓜挽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容

  • LLDB的Xcode默認的調試器征绸,它與LLVM編譯器一起久橙,帶給我們更豐富的流程控制和數(shù)據檢測的調試功能。平時用Xc...
    小笨狼閱讀 20,475評論 31 187
  • ??LLDB的Xcode默認的調試器管怠,它與LLVM編譯器一起淆衷,帶給我們更豐富的流程控制和數(shù)據檢測的調試功能。平時用...
    Thinkdifferents閱讀 1,559評論 1 4
  • [轉]淺談LLDB調試器文章來源于:http://www.cocoachina.com/ios/20150126/...
    loveobjc閱讀 2,507評論 2 6
  • 你是否曾經苦惱于理解你的代碼渤弛,而去嘗試打印一個變量的值祝拯? NSLog(@"%@", whatIsInsideThi...
    F麥子閱讀 1,252評論 1 2
  • 你是否曾經苦惱于理解你的代碼,而去嘗試打印一個變量的值她肯? NSLog(@"%@", whatIsInsideThi...
    paraneaeee閱讀 1,192評論 0 7