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