LLDB使用詳解以及斷點調試教程

LLDB是一款Xcode自帶的斷點調試器,綁定在Xcode底部控制檯中,iOS開發的同窗平時斷點調試確定對下圖不會陌生shell

調試命令

控制檯斷點調試器
在這裏咱們會常用 po, bt這樣的命令來協助調試,今天咱們來詳細講述一下LLDB的各類命令

help

help是最簡單的命令,它會列出全部的命令以及對應的描述.若是你忘記了某個命令是作什麼的,你可使用help <command>來查看具體的細節,例如help print或者help expression.express

help命令

print

顧名思義,該命令用於打印值數組

print命令
LLDB會作前綴匹配,你能夠直接使用 p代替 print

你可能還注意到了$0,嘗試輸出p $0 + 10bash

expression

若是在調試過程當中想改變一個值,這時候就須要用到expression命令.同理,你也可使用e代替expression函數

expression命令

其實你在lldb中輸入help print會發現,工具

help print命令
expression不一樣的是, print命令不須要參數. -- 是用來表示標識的結束和輸入的開始.

打印對象

細心的朋友已經發現上面的str打印略微複雜點,實際上咱們嘗試打印結構更加複雜的對象的時候,結果可能會更糟post

打印數組
熟悉Objective-C的朋友確定知道咱們想要打印的實際上是對象的 description方法的結果,也就是咱們經常使用的 po(print object的縮寫)命令,本質上實際上是 expression -o命令

po命令

打印變量

打印變量

你還可使用p/c或者p/s打印以'\0'結尾的字符串ui

聲明變量

聲明變量並使用

斷點調試

斷點調試流程控制
第一個按鈕是 continue,繼續執行,直到下一個斷點,在LLDB中,可使用 process continue達到相同效果 第二個按鈕是 step over,執行下一步,若是這行代碼是函數調用,不會跳進函數內部,直接執行這個函數, 可使用 thread step-overnext或者 n命令 若是你想要跳進一個函數來調試,可使用第三個按鈕, step in,或者在LLDB中使用 thread step in, step或者 s命令 第四個按鈕是 step out,若是你跳進了一個函數,想要跳過它, step out能夠勝任,該命令會續執行到下一個返回語句

thread return

調試時,還有一個很棒的函數能夠用來控制程序流程:thread return 。它有一個可選參數,在執行時它會把可選參數加載進返回寄存器裏,而後馬上執行返回命令,跳出當前棧幀。這意味這函數剩餘的部分不會被執行。這會給 ARC 的引用計數形成一些問題,或者會使函數內的清理部分失效。可是在函數的開頭執行這個命令,是個很是好的隔離這個函數,僞造返回值的方式lua

斷點

Xcode 提供了一系列工具來建立和管理斷點,左側列表中有一個斷點樣子的按鈕用來查看和管理全部斷點spa

斷點列表
固然你也能夠在LLDB使用 breakpoint list或者 br l命令來查看全部斷點列表.單擊斷點圖標能夠進行開啓或者關閉斷點,在LLDB中使用可使用 breakpoint enable <breakpointID>breakpoint disable <breakpointID>命令來進行該操做

咱們能夠點擊代碼編輯頁面上的行號進行斷點建立,也可使用breakpoint set命令建立breakpoint set -f <filename> -l <line number>,該命令也能夠直接使用縮寫b,同時也能夠直接使用b <function name>建立斷點而不用指定哪一行

若是想建立符號斷點,能夠在下圖位置選擇第三個Symbolic Breakpoint

選擇符號斷點
這時候會出現下圖的彈出框(該彈出框也能夠經過右擊Xcode斷點彈出)

符號斷點編輯
你能夠在 Symbol中添加函數 funct,這樣每次執行到 funct函數都會進入斷點.或者你也能夠加入[NSArray objectAtIndex:] 這樣的符號斷點.這樣每次調用這個函數的時候,程序都會中止,不論是你調用仍是蘋果調用.

你也能夠在編輯斷點中添加Condition,操做以下圖:

符號斷點Condition編輯

上面的例子中,你或許想知道每一次到達斷點的時候 i 的值。咱們可使用 p i 做爲斷點行爲.這樣每次到達斷點的時候,都會自動運行這個命令. 你也能夠添加多個行爲,能夠是調試器命令,shell 命令,也能夠是更直接的打印

Automatically continue after evaluation actions勾上以後執行Action以後繼續運行程序

在iOS APP中調試

點擊Xcode上的暫停按鈕或者在LLDB中執行process interrupt命令. 執行po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]命令

視圖層次

更新UI

// 獲取imageView
e id $imageView = (id)0x7fc40bf1a200
// 改變顏色
e (void)[$imageView setBackgroundColor:[UIColor blueColor]]
複製代碼

點擊繼續運行程序,便能看到變化.由於改變的內容必須被髮送到渲染服務中,而後顯示纔會被更新. 渲染服務其實是一個另外的進程 (被稱做 backboardd)。這就是說即便咱們正在調試的內容所在的進程被打斷了,backboardd 也仍是繼續運行着的.

這意味着你能夠運行下面的命令,而不用繼續運行程序

e (void)[CATransaction flush]
複製代碼

同理你也能夠實現push另外一個VC這樣的操做. 如有錯誤,請不吝賜教.

參考資料:與調試器共舞 - LLDB 的華爾茲

關聯推薦:LLDB調試加強插件Chisel安裝與使用教程

相關文章
相關標籤/搜索