我們職責是開發iOS應用,我們要做的就是生產bug和解決bug,調試對於每一個開發人員來說都是亙古不變的操作。如何高效調試提高我們的裝X技能了,所以掌握Xcode的LLDB最爲重要。
LLDB
首先瞟一眼LLDB長啥樣,如下圖:
LLDB 是一個有着 REPL 的特性和 C++ 、Python 插件的開源調試器。
LLDB命令結構
<command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]
其中:
- command、subcommand:LLDB調試命令的名稱。命令和子命令按層級結構來排列:一個命令對象爲跟隨其的子命令對象創建一個上下文,子命令又爲其子命令創建一個上下文,依此類推。
- action:命令操作,想在前面的命令序列的上下文中執行的一些操作。
- options:命令選項,行爲修改器(action modifiers)。通常帶有一些值。
- argument:命令參數,根據使用的命令的上下文來表示各種不同的東西。
- []:表示命令是可選的,可以有也可以沒有。
比例 po isFinish, po就是命令操作(print -object 簡寫), isFinish就是命令參數
原始命令
原始命令會將命令後面所有東西當做參數處理,很多原始命令也可以帶命令選項,但是需要加-命令選項 -- 命令參數
區分, 注意–後的空額
(lldb) expression -o -- aTureValue
true
// 錯誤示範
(lldb) expression -o --aTureValue
error: <EXPR>:3:3: error: consecutive statements on a line must be separated by ';'
-o --aTureValue
^
;
常用命令
命令 | 全命令 | 介紹 |
---|---|---|
help | - | 命令提示,會羅列所有命令,非常有用,所有命令忘記了。有它就可以找其他命令了 |
a | apropos | 命令輔助,apropos 關鍵字可以搜索出相關的命令 |
e、ex、exp … | expression | 調試時動態執行表達式,並將結果打印出來,比如值動態更改,UI更改 |
vo/po | -/print -object | 與expr類似,打印對象,會調用description方法, 推薦使用vo更快,信息更全 |
v/p | print(type)表達式, 簡單打印推薦使用v | |
call | - | 調用方法 |
bt | thread backtrace | 打印調用堆棧, 查看當前堆棧方法調用非常有用 |
實例技巧
調試UI
如果在運行界面得時候,有時候需要小調界面,常常需要寫代碼,然後重新編譯,走流程,如果界面邏輯很深則需要很多時間。其實在斷點調試的時候就可以執行表達式,刷新界面。
關鍵代碼
// 先執行修改表達式
expression XXX
// 最後刷新[一定要執行纔有效果]
expression CATransaction.flush()
修改背景色爲紅色
修改前
修改後
Tips: 這個調試在viewDidAppear(比如在viewDidLoad斷點執行改變UI)執行之前不會立即有效,其他大部分刷新立即有效。
參考
- iOS開發調試概覽 - Kenshin cui
- Xcode 和 LLDB 高級調試教程:第 1 部分: 使用表達式進行動態值更改,操作屬性
- Xcode 和 LLDB 高級調試教程:第 2 部分: 設置屬性觀察點,值改變的時候會斷點提示
- Xcode 和 LLDB 高級調試教程:第 3 部分:設置符號斷點進行調試