LLDB是個開源的內置於XCode的具備REPL(read-eval-print-loop)特徵的Debugger,其能夠安裝C++或者Python插件。html
本系列針對於已經知道何爲debugger,且有gdb或者lldb使用經驗的讀者。對於lldb的嫺熟使用者,也能夠用來做爲查閱手冊。python
這一篇,咱們講述lldb內建的命令。objective-c
lldb與gdb命令名的對照表:http://lldb.llvm.org/lldb-gdb.htmlexpress
單單執行help命令會列出全部命令列表,用戶加載的插件通常來講列在最後。xcode
執行help 能夠打印指定command的幫助信息,至於插件提供的命令,其幫助信息取決於插件自己的實現。編輯器
例如 help print會打印內建命令print的使用幫助。函數
print命令的簡化方式有prin pri p,惟獨pr不能用來做爲檢查,由於會和process混淆,幸運的是p被lldb實現爲特指print。工具
實際上你會發現,lldb對於命令的簡稱,是頭部匹配方式,只要不混淆,你能夠隨意簡稱某個命令。oop
例如:spa
值得說明的是,返回的$0是命令結果的引用名,使用$0能夠進行print $0 + 7這樣打印出106,固然,$0能夠被用於任何其餘表達式或者接收參數的命令。
expression命令能夠用來修改變量的值,固然大部分狀況下,使用xcode提供的可視化編輯器更方便。
1 2 3 4 |
|
實際上print至關於expression --,而--的意思是命令的參數終止,跟在--後面的都是命令的輸入數據。
要打印一個對象,則須要使用e -O -- anObj,而e -O -- 的縮寫正是咱們經常使用的po命令:
1 2 3 4 5 |
|
要按特定格式來打印一個變量則使用p/
命令:
1 2 3 4 5 6 7 8 |
|
或者使用p/c打印字符,p/s打印c字符串,詳細格式查閱這裏。
既然咱們已經知道print其實是expression --的簡寫,那麼在p(或者po)後面跟上覆雜的表達式則能夠先計算表達式再打印最後的計算結果。
1 2 3 4 5 6 7 8 9 10 11 |
|
值得注意的是,一旦出現了上述錯誤提示,說明lldb沒法斷定某一步的計算結果是什麼數據類型,這時須要強制類型轉換來告訴lldb:
1 2 3 4 |
|
實際上使用xcode自帶的可視化工具來控制「繼續」「暫停」「下一步」「進入」「跳出」更簡單,但這裏仍是列出其所對應的命令名:
繼續:process continue, continue, c
下一步:thread step-over, next, n
進入:thread step-in, step, s
跳出:thread step-out, finish, f
執行thread return命令可使得當前函數當即返回,也就是說,後續代碼都不會執行了。固然執行此命令可能會使得arc的計數追蹤出現錯亂。
thread return命令須要一個參數來指明函數強制返回時的返回值。
通常來講,在xcode中新建/刪除「行斷點」是很容易的,可是斷點還有不少進階使用方法:
條件斷點、條件執行、記錄日誌、自動繼續、重複斷點跳過。
使用xcode提供的可視化工具來操做是很容易的:
1 2 3 4 5 6 7 |
|
因此,在debugger中能夠修改view的顏色、尺寸、甚至建立controller來push。
watchpoint能夠在某個變量被寫入/讀取時暫停程序運行:
1 2 3 4 5 6 7 8 9 10 11 |
|
實際上可使用watchpoint來監視任意一段內存的讀寫。
使用XCode也能夠方便地建立watchpoint。
XCode的可視化debug工具中的watch是一個write類型watchpoint(也就是默認的)
另外,上述語句中 v是variable的簡寫,一樣的,set能夠簡寫爲s,watch能夠簡寫爲wa,而-w後面的參數是不能夠簡寫的必須爲read、write或者read_write。
當前在arm和x86上,咱們一次最多建立4個watchpoint,繼續建立會提示錯誤。
用xcode的可視化工具建立符號斷點很簡單,在Add symbolic breakpoint中填入符號名便可,這裏給出objective-c的函數符號斷點的寫法:
1 2 |
|
使用XCode的可視化工具來查看memory,要注意watch memory of "p" 和watch memory of "*p"的區別。
手動執行命令能夠help x或者 help memory。
lldb的用法很靈活多樣,可是XCode的可視化調試工具覆蓋面有限,一些高級用法仍需手動輸入命令,甚至結合python腳本。