「若是調試是刪除 bug 的過程,那麼編程就是引入 bug 的過程。」(Edsger W. Dijkstra)html
對於蘋果開發者而言,LLDB 是無人不知的調試工具,然而此知非彼知,相信有至關規模的開發者對 LLDB 的瞭解仍然停留於幾個基礎命令的使用,今天讓咱們來從新認識一下既熟悉又陌生的 LLDB,看看它那些你未曾用過的強大功能,以及如何提升咱們的開發效率。git
開始把玩其功能以前,先搞清楚 LLDB 是什麼,簡言之,LLDB 是一個有着 REPL 的特性和 C++ 、Python 插件的開源調試器。github
LLDB is a next generation, high-performance debugger. It is built as a set of reusable components which highly leverage existing libraries in the larger LLVM Project, such as the Clang expression parser and LLVM disassembler.
LLDB is the default debugger in Xcode on Mac OS X and supports debugging C, Objective-C and C++ on the desktop and iOS devices and simulator.express
以上摘自官方文檔中的一段簡短的介紹,更多相關信息請參閱 LLDB 官方文檔。編程
知道了 LLDB 是什麼,還要了解其命令結構及語法,這樣才能告別死記命令,開啓壓榨 LLDB 之路了。LLDB 通用結構的形式以下:sass
<command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]
markdown
其中:函數
舉個例子:工具
命令:breakpoint set -n main
對應到上面的語法就是:oop
關於原始命令:
LLDB支持不帶命令選項的原始命令,原始命令會將命令後面的全部東西當作參數(arguement)處理。但不少原始命令也能夠帶命令選項,當你使用命令選項的時候,須要在命令選項後面加 --
區分命令選項和參數。
如:expression
(就是 p
/print
/call
)、expression -o
(就是 po
),打印一個UIView
對象地址:
當咱們並不能徹底記得某個命令的時候,使用 apropos 經過命令中的某個關鍵字就能夠找到全部相關的命令信息。 好比: 咱們想使用stop-hook的命令,可是已經不記得stop-hook命令是啥樣了:
關於斷點設置,多數人都習慣用圖形界面去作,但在調試中有些場景僅僅靠圖形界面仍是不夠的,好比:如何經過斷點實現相似 KVO 那樣對成員變量變化的監聽呢?(別跟我說你要加代碼重寫set方法...即便這樣也不靠譜)。下面一一羅列那些好用的斷點命令:
這兩幅圖你必定不陌生:
其餘命令:
這些命令在逆向及定位錯誤時使用頻率很是高。
.lldbinit
文件 & 插件安裝前面所列的命令在 這裏 都能找到官方說明,更多命令用法有興趣的建議本身去細細探索,接下來咱們將站在巨人的肩膀上,用高手們專門爲 LLDB 寫的插件去深刻挖掘它的潛力。
推薦插件一: facebook 開源的 LLDB 插件 chisel
brew install chisel
的安裝過程這裏就不贅述了,安裝成功後,在~/目錄下的 .lldbinit
文件中引入對應文件路徑,增長一行:command script import /usr/local/opt/chisel/libexec/fblldb.py
後保存, 重啓 Xcode便可使用。它提供的快捷 命令清單及說明 這裏也不贅述了。截個圖感覺下它的強大吧:
推薦插件二:DerekSelander/LLDB
該插件與 chisel 都是用 Python 寫的,其安裝須要手動下載倉庫,而後將倉庫中 dslldb.py
文件的路徑用與上述一樣的方式添加到 .lldbinit
中,具體用法也很簡單粗暴,就不在這粘貼了,請至 README 領略。
看到這,你收穫的只有暫時記憶,其實等於毫無所獲...並且還浪費了寶貴的幾分鐘,這不是你但願的結果,而避免其成爲事實的惟一方式就是:實踐。打開 Xcode,運行一個項目,參照着文中涉及到的說明文檔,試着敲一敲每一個命令,體會一下它們的用法與區別。最後,爲你的 LLDB 配好插件,去感覺它的蛻變,相信我,你的開發效率提高的可不止一點點。學習是一種能力,拒絕操做手冊式灌輸,分享者多半是在總結學習收穫時爲讀者提供一些思路或方向,這也是我爲你保留一絲探索餘地的初衷,願你有所收穫。
水平有限,請大神多多指正。下篇再會~