LLDB是一款Xcode自帶的斷點調試器,綁定在Xcode底部控制檯中,iOS開發的同窗平時斷點調試確定對下圖不會陌生shell
po
,
bt
這樣的命令來協助調試,今天咱們來詳細講述一下LLDB的各類命令
help是最簡單的命令,它會列出全部的命令以及對應的描述.若是你忘記了某個命令是作什麼的,你可使用help <command>
來查看具體的細節,例如help print
或者help expression
.express
顧名思義,該命令用於打印值數組
LLDB會作前綴匹配,你能夠直接使用p
代替
print
你可能還注意到了$0
,嘗試輸出p $0 + 10
bash
若是在調試過程當中想改變一個值,這時候就須要用到expression
命令.同理,你也可使用e
代替expression
函數
其實你在lldb中輸入help print
會發現,工具
expression
不一樣的是,
print
命令不須要參數. -- 是用來表示標識的結束和輸入的開始.
細心的朋友已經發現上面的str
打印略微複雜點,實際上咱們嘗試打印結構更加複雜的對象的時候,結果可能會更糟post
description
方法的結果,也就是咱們經常使用的
po
(print object的縮寫)命令,本質上實際上是
expression -o
命令
你還可使用p/c
或者p/s
打印以'\0'
結尾的字符串ui
continue
,繼續執行,直到下一個斷點,在LLDB中,可使用
process continue
達到相同效果 第二個按鈕是
step over
,執行下一步,若是這行代碼是函數調用,不會跳進函數內部,直接執行這個函數, 可使用
thread step-over
和
next
或者
n
命令 若是你想要跳進一個函數來調試,可使用第三個按鈕,
step in
,或者在LLDB中使用
thread step in
,
step
或者
s
命令 第四個按鈕是
step out
,若是你跳進了一個函數,想要跳過它,
step out
能夠勝任,該命令會續執行到下一個返回語句
調試時,還有一個很棒的函數能夠用來控制程序流程: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
Symbol
中添加函數
funct
,這樣每次執行到
funct
函數都會進入斷點.或者你也能夠加入[NSArray objectAtIndex:] 這樣的符號斷點.這樣每次調用這個函數的時候,程序都會中止,不論是你調用仍是蘋果調用.
你也能夠在編輯斷點中添加Condition,操做以下圖:
上面的例子中,你或許想知道每一次到達斷點的時候 i 的值。咱們可使用 p i
做爲斷點行爲.這樣每次到達斷點的時候,都會自動運行這個命令. 你也能夠添加多個行爲,能夠是調試器命令,shell 命令,也能夠是更直接的打印
Automatically continue after evaluation actions勾上以後執行Action以後繼續運行程序
點擊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 的華爾茲