XCode调试器LLDB
與調試器共舞 - LLDB 的華爾茲
- 你是否曾經苦惱于理解你的代碼,而去嘗試打印一個變量的值?
- 或者跳過一個函數調用來簡化程序的行為?
- 或者短路一個邏輯檢查?
- 或者偽造一個函數實現?
并且每次必須重新編譯,從頭開始?
構建軟件是復雜的,并且 Bug 總會出現。一個常見的修復周期就是修改代碼,編譯,重新運行,并且祈禱出現最好的結果。
但是不一定要這么做。你可以使用調試器。而且即使你已經知道如何使用調試器檢查變量,它可以做的還有很多。
這篇文章將試圖挑戰你對調試的認知,并詳細地解釋一些你可能還不了解的基本原理,然后展示一系列有趣的例子。現在就讓我們開始與調試器共舞一曲華爾茲,看看最后能達到怎樣的高度。
LLDB
LLDB 是一個有著 REPL 的特性和 C++ ,Python 插件的開源調試器。LLDB 綁定在 Xcode 內部,存在于主窗口底部的控制臺中。調試器允許你在程序運行的特定時暫停它,你可以查看變量的值,執行自定的指令,并且按照你所認為合適的步驟來操作程序的進展。(這里有一個關于調試器如何工作的總體的解釋。)
你以前有可能已經使用過調試器,即使只是在 Xcode 的界面上加一些斷點。但是通過一些小的技巧,你就可以做一些非常酷的事情。GDB to LLDB 參考是一個非常好的調試器可用命令的總覽。你也可以安裝 Chisel,它是一個開源的 LLDB 插件合輯,這會使調試變得更加有趣。
與此同時,讓我們以在調試器中打印變量來開始我們的旅程吧
基礎
這里有一個簡單的小程序,它會打印一個字符串。注意斷點已經被加在第 8 行。斷點可以通過點擊 Xcode 的源碼窗口的側邊槽進行創建。
- 程序會在這一行停止運行,并且控制臺會被打開,允許我們和調試器交互。那我們應該打些什么呢?
help
- 最簡單命令是 help,它會列舉出所有的命令。如果你忘記了一個命令是做什么的,或者想知道更多的話,你可以通過 help command 來了解更多細節,例如 help print 或者 help thread。如果你甚至忘記了 help 命令是做什么的,你可以試試 help help。不過你如果知道這么做,那就說明你大概還沒有忘光這個命令。
打印值很簡單;只要試試 print 命令:
LLDB 實際上會作前綴匹配。所以你也可以使用 prin,pri,或者 p。但你不能使用 pr,因為 LLDB 不能消除和 process 的歧義 (幸運的是 p 并沒有歧義)。
你可能還注意到了,結果中有個 $0。實際上你可以使用它來指向這個結果。試試 print $0 + 7,你會看到 106。任何以美元符開頭的東西都是存在于 LLDB 的命名空間的,它們是為了幫助你進行調試而存在的。
expression
如果想改變一個值怎么辦?你或許會猜 modify。其實這時候我們要用到的是 expression 這個方便的命令。
這不僅會改變調試器中的值,實際上它改變了程序中的值。這時候繼續執行程序,將會打印 42 red balloons。神奇吧。
注意,從現在開始,我們將會偷懶分別以 p 和 e 來代替 print 和 expression。
什么是 print 命令
考慮一個有意思的表達式:p count = 18。如果我們運行這條命令,然后打印 count 的內容。我們將看到它的結果與 expression count = 18 一樣。和 expression 不同的是,print 命令不需要參數。比如 e -h +17 中,你很難區分到底是以 -h 為標識,僅僅執行 +17 呢,還是要計算 17 和 h 的差值。連字符號確實很讓人困惑,你或許得不到自己想要的結果。
幸運的是,解決方案很簡單。用 -- 來表征標識的結束,以及輸入的開始。如果想要 -h 作為標識,就用 e -h -- +17,如果想計算它們的差值,就使用 e -- -h +17。因為一般來說不使用標識的情況比較多,所以 e -- 就有了一個簡寫的方式,那就是 print。
輸入 help print,然后向下滾動,你會發現:
打印對象
- 嘗試輸入
- 輸出會有點啰嗦
- 如果我們嘗試打印結構更復雜的對象,結果甚至會更糟
- 實際上,我們想看的是對象的 description 方法的結果。我么需要使用 -O (字母 O,而不是數字 0) 標志告訴 expression 命令以 對象 (Object) 的方式來打印結果。
- 幸運的是,e -o -- 有也有個別名,那就是 po (print object 的縮寫),我們可以使用它來進行簡化:
變量
- 現在你已經可以打印對象和簡單類型,并且知道如何使用 expression 命令在調試器中修改它們了。現在讓我們使用一些變量來減少輸入量。就像你可以在 C 語言中用 int a = 0 來聲明一個變量一樣,你也可以在 LLDB 中做同樣的事情。不過為了能使用聲明的變量,變量必須以美元符開頭。
轉載于:https://www.cnblogs.com/ShaoYinling/p/8459513.html
總結
以上是生活随笔為你收集整理的XCode调试器LLDB的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原码,反码,补码,移码四种机器码的表示方
- 下一篇: socket epoll网络编程实例