iOS開發(fā)中的LLDB調(diào)試(實(shí)戰(zhàn)版)

工欲善其事,必先利其器。以下是各常用LLDB調(diào)試操作(文章精簡自http://www.itdecent.cn/p/d6a0a5e39b0e)

從快捷鍵開始

快捷鍵功能 命令
暫停/繼續(xù) cmd+ctrl+Y
控制臺(tái)顯示/隱藏 cmd+Y
光標(biāo)切換到控制臺(tái) cmd+shift+C
清空控制臺(tái) cmd+k
step over F6
step into F7
step out F8

開始時(shí)候記住cmd+K 以及 cmd+ctrl+Y基本也就夠用了,當(dāng)然熟悉各種快捷操作會(huì)大大加大Coding時(shí)逼格,提高撩妹(漢) 成功率

HELP

LLDB入門時(shí)可以通過和help查詢命令的意義

終端操作截圖(當(dāng)然可以直接在Xcode的命令行直接輸入 help thread backtrace查看)

查詢命令

p,po都可以在命令行做變量查詢。所不同是·po·是expression -o --縮寫,可以打印對(duì)象而不是對(duì)象指針(可重寫對(duì)象description方法,增加調(diào)試時(shí)可讀性),p即是print,也是expression --的縮寫,所不同是只會(huì)打印一個(gè)$符號(hào),數(shù)字,加一段地址信息(不會(huì)打印處description內(nèi)容,當(dāng)進(jìn)行一些指針BUG調(diào)試時(shí)p更加實(shí)用)。

代碼塊,斷點(diǎn)位置

po操作

po與p的比較

ps:$符號(hào)在LLDB中代表著變量的分配。每次使用p后,會(huì)自動(dòng)為你分配一個(gè)變量,后面再次想使用這個(gè)變量時(shí),就可以直接使用。我們可以直接使用這個(gè)地址做一些轉(zhuǎn)換,獲取對(duì)象的信息

修改操作

'e' 即expression的縮寫,作用為執(zhí)行一個(gè)表達(dá)式(當(dāng)然直接'e' + 變量可以實(shí)現(xiàn)查詢),最主要作用是通過執(zhí)行表達(dá)式,調(diào)試過程中動(dòng)態(tài)修改當(dāng)前線程堆棧。

例如上例中判斷位置的斷點(diǎn),e string = nil后可實(shí)現(xiàn)動(dòng)態(tài)修改判斷。


e操作也可以通過執(zhí)行表達(dá)式,改變UI。例如修改UI背景色,判斷布局是否正確

斷點(diǎn)修改前

命令行操作

修改后(注意此時(shí)仍在斷點(diǎn)中,但頁面UI已經(jīng)刷新了)

'@improt UIkit'操作在沒有引入相應(yīng)頭文件時(shí)很必要,此處多余。UI調(diào)試時(shí)有個(gè)特殊問題,當(dāng)斷點(diǎn)或者暫停時(shí),UI更新的線程也被暫停了,e修改后的UI當(dāng)然也不會(huì)立即更新,此時(shí)如果還不想放開斷點(diǎn)讓UI更新,可以通過[CATransaction flush]表達(dá)式來進(jìn)行UI刷新操作。例如修改后截圖

PS: 玩轉(zhuǎn)修改操作可以大大減少調(diào)試編譯時(shí)間,非常有用的技巧。

斷點(diǎn)

1.breakpoint,GUI如何添加添加沒必要再說了。

  • 全局?jǐn)帱c(diǎn) Add Exception Breakpoint
會(huì)在拋出異常的堆棧自動(dòng)暫停,當(dāng)然實(shí)際開發(fā)中靠譜度有限
  • 符號(hào)斷點(diǎn)Add Symbolic Breakpoint
    這個(gè)很有趣,我在看http://www.itdecent.cn/p/d6a0a5e39b0e文章前也沒有留意過,當(dāng)開發(fā)過程中經(jīng)常會(huì)有一些Api接口不知道是在什么時(shí)候調(diào)用的,可以通過在斷點(diǎn)列表中添加
添加[ViewController testCalled]方法被調(diào)用時(shí)候的斷點(diǎn)

斷點(diǎn)觸發(fā)

當(dāng)然自定義的方法可以在實(shí)現(xiàn)里添加斷點(diǎn),但是對(duì)于一些框架接口的調(diào)用調(diào)試時(shí)'Symbolic Breakpoint'就格外有用了

  1. watchpoint

watchpoint可以跟蹤對(duì)象某一字段的修改,(屬性修改可以在setter方法自己添加斷點(diǎn)觀察,但是屬性字段修改并不一定都會(huì)走setter方法)。值得一提的是watchpoint是直接設(shè)置在變量內(nèi)存地址上的,所以當(dāng)變量被釋放后,watchpoint仍然會(huì)在該內(nèi)存地址上生效.


GUI中可以通過命令行左邊添加(例:給viewcontroller對(duì)象的testNumber屬性字段添加watchpoint)

testNumber字段被修改

堆棧

1.btthread backtrace,作用是打印當(dāng)前線程信息。


2.thread retrun<expr>,調(diào)試時(shí)候可以直接在斷點(diǎn)位置retrun想要的值。

修改前

修改后

寫在最后

做iOS開發(fā)這么久終于決定開始寫自己的博客了,這篇文章除了整理LLDB知識(shí)外也是為了熟悉下markdown語法

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

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

  • 你是否曾經(jīng)苦惱于理解你的代碼,而去嘗試打印一個(gè)變量的值? NSLog(@"%@", whatIsInsideThi...
    paraneaeee閱讀 1,321評(píng)論 0 7
  • 轉(zhuǎn)載 與調(diào)試器共舞 - LLDB 的華爾茲: https://objccn.io/issue-19-2/ 推薦:i...
    F麥子閱讀 3,448評(píng)論 0 10
  • 你是否曾經(jīng)苦惱于理解你的代碼,而去嘗試打印一個(gè)變量的值? NSLog(@"%@", whatIsInsideThi...
    木易林1閱讀 1,033評(píng)論 0 4
  • [轉(zhuǎn)]淺談LLDB調(diào)試器文章來源于:http://www.cocoachina.com/ios/20150126/...
    loveobjc閱讀 2,728評(píng)論 2 6
  • 與調(diào)試器共舞 - LLDB 的華爾茲 nangege 2014/12/19 你是否曾經(jīng)苦惱于理解你的代碼,而去嘗試...
    McDan閱讀 940評(píng)論 0 0

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