1. 程式人生 > >LLdb篇二 教你使用faceBook的chisel來提高除錯效率

LLdb篇二 教你使用faceBook的chisel來提高除錯效率

轉載自http://www.jianshu.com/p/b2371dd4443b

這次真是久違的第二篇了,過年的時候一直在幫家裡帶孩子,順便用webStorm這個神器重新溫習了下前端的知識。然後最近剛來北京又是重感冒,又是找房子,整個來說coding還是寫部落格效率極低又苦不堪言。

首先如果使用lldb,最好你要學著使用chisel來提高效率,否則你會浪費很多的時間,除非你自己會寫python指令碼,自己封裝一些lldb的命令。

安裝chisel

chisel的安裝是十分簡單,它是在終端通過brew安裝的,具體可以點選連結參考github的安裝說明,唯一需要注意的一點就是命令列安裝完之後,它會在安裝完之後顯示出chisel的安裝地址path.在執行下面的命令時候要記得替換/path/to/fblldb.py這一塊。

# ~/.lldbinit
...  
command script import /path/to/fblldb.py
script fblldb.loadCommandsInDirectory('/magical/    
commands/')

如果安裝成功的話,那麼你就會看到如下圖的這些命令。

lldb help
lldb help

這裡大概會有30個命令吧,我記得我第一次裝的時候沒那麼多命令的,facebook又更新了很多。其實這些封裝的命令,就是使用python封裝了一下函式然後呼叫。凡是這些封裝的命令,你都可以通過多個lldb命令打出來,所以如果你會使用python的話,那麼你可以根據自己的使用習慣封裝一些常用的lldb命令。我使用了也有一段時間的chisel了,但是感覺並不是所有的命令都很常用,而且有寫使用的場景也不是很清楚,所以在這裡給大家普及一下,如果有謬誤,請大家及時指正。(ps:和大家說個快捷鍵,cmd+k快速清楚console的資訊。)

一般我們使用chisel的命令的時候,我們可以通過 help + chisel命令,譬如 help + pvc,得到如何具體使用這個命令,但是有時候你看了help資訊也不一定就會用呢。

image
image

pviews

這個命令是我最常使用的命令。它能夠幫助我們看到view的層級,即使我們並沒有觸發到一個斷點。操作如下:

pviews
pviews
  • 如圖我沒有設定任何斷點,只是點選控制檯的暫停圖示,就可以撥出lldb控制檯了。然後再這裡輸出pviews這個命令。
  • 然後這個命令主要可以看到當前的view層級,如果我們寫了一個控制元件沒有顯示。我們就可以通過這個命令來排查。
  • 排查首先看有沒有我們新增的這個view,如button,如果記憶體地址裡沒有這個button,說明沒有新增到view中(沒呼叫addSubview方法)
  • 然後可以看到這個button的地址,我們可以看到這個button的frame屬性,根據屬性判斷是否是位置或者大小不合適。
  • 再次,我們要看是否hidden被設定成了yes,如果設定了yes的話,在列印資訊中會打印出來。因為預設view的isHidden是no,所以沒被列印。
  • 最後如果是button可以檢查下是否設定了圖片,如果是view,就可以檢視下顏色是否與後面的控制元件一致,這就引入到了下一個命令border。

border&unborder

border
border

這個命令可以直接給border 新增邊框顏色和邊框的寬度,使用如下:

border 0x79ec3140 -c green -w 2

border這個命令常常在我們需要檢視邊框的邊緣的問題,常常用到,而且我們想要設定的直接在lldb中設定,完全不需要重新寫程式碼再次執行。我就是通過直接暫停程式,並且通過pviews命令找到的控制元件的地址,並且呼叫命令顯示的。當我們不需要的時候可以通過unborder這個命令去掉邊框。整個過程一氣呵成。

pinternals

pinternals
pinternals

這個命令就是打印出來的一個控制元件(id)型別的內部結構,詳細到令人髮指!甚至是你自定義的控制元件中的型別,譬如這個styleView就是我自定義的,內部有個iconView的屬性,其中的值它也會打印出來。好處,你們自己琢磨吧。(ps:這個demo,我會在下一篇部落格中放出來,下篇部落格是說transform的。

presponder

打印出一個集成於UIResponder控制元件的訊息傳遞鏈。

presponder
presponder

這個也方便我們瞭解訊息是如何傳遞的,列印的時候是倒敘列印的。

visualize

可以使用mac下的預覽app開啟我們的圖片UIImage, CGImageRef格式的圖片,甚至view和layer的圖片 。

visualize 0x79ec3140//或者變數名,此地址是id型別的

pclass

pclass可以打印出一個物件的繼承關係。

pclass
pclass

taplog

這個命令是模擬敲擊一下螢幕,並且打印出你敲擊螢幕時候事件接收的物件。

image
image

hide&show

hide命令可以直接隱藏一個物件,移除當前遮擋的物件便於你觀察後面的物件。show命令會讓它再次顯示出來。

bmessage

這個命令就是lldb新增一個斷點,譬如-viewWillAppear:這個方法,在當前控制器中你沒有實現它,但是你又想在呼叫它的時機觸發中斷。

Arguments:
<expression>; Type: string; Expression to set a breakpoint on, e.g. "-[MyView setFrame:]", "+[MyView awesomeClassMethod]" or "-[0xabcd1234 setFrame:]"

這個我就不解釋了,需要補充一點的是oc的方法是帶的。

其他命令

其它命令我用著並不是太多,並不代表他們不常用。只是我用的不太好而已,而且我認為用到是需要特殊的場景的,這個裡說幾個我感覺有很大作用但是我用的又不好的。

  1. wivar,這個命令是加watchPoint,用的好,就相當於使用lldb寫了kvo了。(ps:恕我沒研究明白)
  2. pvc這個命令的作用是打印出當前的控制器層級,(ps:有時好使,有時又很壞,似魔鬼的步伐.?,沒研究明白)
  3. vsfv,fvc,這幾個命令都需要正則表示式的知識背景,因為我正則表示式從來都是百度,也沒自己真正學過。所以對我不常用,但是對那些會正則的可能會很大作用。(ps:希望你們研究出來有什麼好的技巧分享下)

參考

我寫的這些關於lldb的東西只是九牛一毛,它可以做的事情特別多,上面的參考都是我看過的比較好的lldb的知識,大家瞭解可以通過我上面的一些網站,更加深入的第三篇,我一時半會不會寫的,因為那個才是真正的進階,而我還沒達到那種高度,如果你也有好的關於lldb的技巧,理解之類的,歡迎分享。