你是否曾經(jīng)苦惱于理解你的代碼,而去嘗試打印一個(gè)變量的值?
NSLog(@"%@", whatIsInsideThisThing);
或者跳過一個(gè)函數(shù)調(diào)用來簡化程序的行為?
NSNumber *n = @7; // 實(shí)際應(yīng)該調(diào)用這個(gè)函數(shù):Foo();
或者短路一個(gè)邏輯檢查?
if (1 || theBooleanAtStake) { ... }
或者偽造一個(gè)函數(shù)實(shí)現(xiàn)?
int calculateTheTrickyValue {
return 9;
/*
先這么著
...
}
并且每次必須重新編譯,從頭開始?
構(gòu)建軟件是復(fù)雜的,并且 Bug 總會(huì)出現(xiàn)。一個(gè)常見的修復(fù)周期就是修改代碼,編譯,重新運(yùn)行,并且祈禱出現(xiàn)最好的結(jié)果。
但是不一定要這么做。你可以使用調(diào)試器。而且即使你已經(jīng)知道如何使用調(diào)試器檢查變量,它可以做的還有很多。
這篇文章將試圖挑戰(zhàn)你對調(diào)試的認(rèn)知,并詳細(xì)地解釋一些你可能還不了解的基本原理,然后展示一系列有趣的例子?,F(xiàn)在就讓我們開始與調(diào)試器共舞一曲華爾茲,看看最后能達(dá)到怎樣的高度。
LLDB 是一個(gè)有著 REPL 的特性和 C++ ,Python 插件的開源調(diào)試器。LLDB 綁定在 Xcode 內(nèi)部,存在于主窗口底部的控制臺(tái)中。調(diào)試器允許你在程序運(yùn)行的特定時(shí)暫停它,你可以查看變量的值,執(zhí)行自定的指令,并且按照你所認(rèn)為合適的步驟來操作程序的進(jìn)展。(這里有一個(gè)關(guān)于調(diào)試器如何工作的總體的解釋。)
你以前有可能已經(jīng)使用過調(diào)試器,即使只是在 Xcode 的界面上加一些斷點(diǎn)。但是通過一些小的技巧,你就可以做一些非??岬氖虑?。GDB to LLDB 參考是一個(gè)非常好的調(diào)試器可用命令的總覽。你也可以安裝 Chisel,它是一個(gè)開源的 LLDB 插件合輯,這會(huì)使調(diào)試變得更加有趣。
與此同時(shí),讓我們以在調(diào)試器中打印變量來開始我們的旅程吧。
這里有一個(gè)簡單的小程序,它會(huì)打印一個(gè)字符串。注意斷點(diǎn)已經(jīng)被加在第 8 行。斷點(diǎn)可以通過點(diǎn)擊 Xcode 的源碼窗口的側(cè)邊槽進(jìn)行創(chuàng)建。
http://wiki.jikexueyuan.com/project/objc/images/19-5.png" alt="" />
程序會(huì)在這一行停止運(yùn)行,并且控制臺(tái)會(huì)被打開,允許我們和調(diào)試器交互。那我們應(yīng)該打些什么呢?
最簡單命令是 help
,它會(huì)列舉出所有的命令。如果你忘記了一個(gè)命令是做什么的,或者想知道更多的話,你可以通過 help <command>
來了解更多細(xì)節(jié),例如 help print
或者 help thread
。如果你甚至忘記了 help
命令是做什么的,你可以試試 help help
。不過你如果知道這么做,那就說明你大概還沒有忘光這個(gè)命令。