Advanced+Apple+Debugging(8)

來源:互聯網
上載者:User

標籤:lldb

你可能注意到在你的開發人員生涯中, 一遍又一遍的輸入相同的東西真的很糟糕.如果你用的某個指令輸入起來很麻煩, 沒有原因表明你應該輸入完整的指令.僅僅是因為你學習了如何建立Regex斷點, 你不得不瘋狂的輸入Swift函數的完整名字.
同樣的觀點在LLDB中可以被應用到所有的指令上, 設定上, 或者代碼執行上.然而, 截至目前這裡有兩個問題尚未解決:為你的指令建立快速鍵並儲存它們!你每次運行一個新的LLDB會話的時候, 你之前執行的所有的命令都會消失!
在本章中, 你將學習如何讓通過.lldbinit檔案持久化這些命令.通過持久化你為自己建立方便的命令, 你的調試過程將會變得很流暢和高效. 這同樣是一個很重要的概念因為從現在起, 你將會定期使用.lldbinit檔案.

如何持久化?

當LLDB被調用的時候, 它會搜尋幾個目錄下面指定的初始設定檔案.如果找到了, 當LLDB啟動之後在附加到指定進程之前這些檔案就會被載入到LLDB中(如果你想在初始化的時候執行任何代碼你就必須知道這一點). 你可以使用這些檔案指定一些設定或者建立自訂的調試命令.
LLDB會在下面幾個地方尋找初始設定檔案:

~/.lldbinit-[context] [context]位置的內容是Xcode, 如果你使用Xcode調試, 或者是lldb如果你通過命令列用LLDB調試.例如, 如果你在終端中調試但是希望命令只在LLDB中生效, 你需要加上的內容是~/.lldbinit-lldb, 同時如果你希望命令只在Xcode中生效你需要使用~/.lldbinit-Xcode.
接下來, LLDB會搜尋在~/.lldbinit中找到的內容. 這裡是處理大多數邏輯的理想檔案, 如果你想在終端中或者Xcode中使用LLDB命令的話.
最後, LLDB會搜尋它被調用時所在的目錄. 不幸的是, 當Xcode調起LLDB的時候, 會在/目錄下調起. 這裡並不是放置.lldbinit檔案的理想位置, 所以本書中會忽略這種特殊的實現方式.
建立.lldbinit檔案

在本章中你將會建立你的第一個.lldbinit檔案.
首先, 開啟終端並輸入:

nano ~/.lldbinit
這會用nano編輯器開啟你的 .lldbinit檔案. 如果在那個位置上已經存在了那個檔案, nano會開啟.lldbinit檔案而不是建立一個新的檔案.

注意:你真的應該使用一些類似viemacs的編輯器編輯.lldbinit, 然後憤怒的在部落格中寫出其他編輯器是如何標新立異的. 我建議使用nano是經過深思熟慮的
在nano編輯器中開啟了以後, 在.lldbinit檔案的末尾加上下面的代碼:

command alias -- Yay_Autolayout expression -l objc -O --
[[[[[UIApplication sharedApplication] keyWindow] rootViewController]
view] recursiveDescription]
這些代碼的作用是建立了一個別名 - 也就是一個長運算式命令的縮寫. 這個別名的名字叫做Yay_Autolayout並且它會執行一個運算式命令擷取根部的UIView(只在iOS中生效)並且會提取出root view的所有子視圖的位置並重新布局所有的子視圖.
按下Ctrl + O來儲存你的更改, 但是現在還沒有退出nano.
開啟Signals的Xcode項目, 構建並運行Signals程式. 在運行起來之後, 停止執行並在調試器中輸入別名:

(lldb) Yay_Autolayout
這將會提取出應用程式中所有的視圖!很興奮吧!

注意:這條很酷的命令, 無論你是否擁有APP的原始碼都會執行的做的同樣好.你可以將LLDB附加到模擬器的SpringBoard並通過執行同樣的方法提取出所有的視圖.
現在, 試著擷取這條新命令的協助:

(lldb) help Yay_Autolayout
輸出的內容看起來有點無聊. 你可以做的更好一點. 回到nano的終端中,並在命令的別名裡添加一些有用的資訊. 就像下面這個樣子:

command alias -H "Yay_Autolayout will get the root view and recursively
dump all the subviews and their frames" -h "Recursively dump views" --
Yay_Autolayout expression -l objc -O -- [[[[[UIApplication
sharedApplication] keyWindow] rootViewController] view]
recursiveDescription]
通過按下Ctrl + O來儲存這個檔案.接下來構建並運行Signals項目.
現在當你停下調試器並輸入help Yay_Autolayout, 你就會在底部看到這些協助文字的輸出. 可以通過-H命令查看. 你也可以僅僅通過輸入help來擷取一些簡介, 它會給出-h和其他一些命令的描述.
現在這些看起來可能毫無意義, 但是當你在.lldbinit檔案中有許多許多自訂命令的時候, 你就會感謝你為自己提供的文檔.

帶參數命令的別名

你剛才只是建立了不需要任何參數的單行命令的別名.然而, 你經常會需要建立一些支援輸入的命令的別名.
返回到開啟nano的終端視窗中. 在檔案的底部輸入下面的內容:

command alias cpo expression -l objc -O --
你就建立了一個叫做cpo的新命令. cpo會做一個普通的po(print object)的操作, 但是它會使用Objective-C的環境. 當你在Swift環境中但是你卻想列印出一個記憶體位址或者一個寄存器或者你知道的可用的Objective-C對象的時候這是一個理想的命令.
儲存你在nano中做出的更改, 然後返回到Signals項目中. 找到MasterViewController的viewDidLoad然後在這個函數頂部建立一個斷點.構建並運行應用程式:

page95image14544.png

理解cpo命令的重要性的最佳方式是, 首先擷取MasterViewController的引用.
(lldb) po self
你將會得到類似下面的輸出:

<Signals.MasterViewController: 0x7fc8295071a0>
取出輸出內容末尾的記憶體位址(通常情況下, 你得到的記憶體位址用上面的有所不同), 並嘗試在調試器中列印出來:

(lldb) po 0x7fc8295071a0
這不會產生任何有意義的輸出內容, 因為你停留在了Swift檔案中, 而Swift是一種型別安全的語言. 簡單的在swift中列印記憶體位址是捕獲做任何事的. 這就是為什麼Objective-C環境在調試的時候如此有用的原因, 特別是在處理只有一個記憶體位址的彙編代碼的時候.
現在, 將你剛才建立的的新命令應用到地址上:

(lldb) cpo 0x7fc8295071a0
你會看到與你執行po self命令是同樣的輸出:

<Signals.MasterViewController: 0x7fc8295071a0>
這是一個擷取對象的description的有用命令, 無論對象是用Objective-C建立的還是使用swift建立的.
這是一個很勉強的例子, 因為你只會使用po self命令.然而, 如果你只有一個記憶體位址, 然後你又不能用po, 這個時候cpo就派上用場了.

我們為什麼要學這些?

你已經學習了如何穿件簡單命令的別名並將他們儲存在.lldbinit檔案中. 這即能在Xcode的LLDB中生效也能在終端的LLDB中生效.
作為一個練習, 在~/.lldbinit檔案總中加你新建立的cpo命令的協助資訊, 以便當你建立了許多自訂命令之後你依然可以想起來這個命令的作用.記住-h選項是簡潔的協助資訊, 而-H選項是比較長的協助資訊.記得使用--分割出你要輸入到命令中的參數.
此外, 為你常用的命令建立一個別名.把這個別名放到~/.lldbinit檔案中, 並使用它!

Advanced+Apple+Debugging(8)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.