教你使用faceBook的chisel來提升調試效率

首先若是使用lldb,最好你要學着使用chisel來提升效率,不然你會浪費不少的時間,除非你本身會寫python腳本,本身封裝一些lldb的命令。 html

安裝chisel

chisel的安裝是十分簡單,它是在終端經過brew安裝的,具體能夠點擊連接參考github的安裝說明,惟一須要注意的一點就是命令行安裝完以後,它會在安裝完以後顯示出chisel的安裝地址path.在執行下面的命令時候要記得替換/path/to/fblldb.py這一塊。 python

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

若是安裝成功的話,那麼你就會看到以下圖的這些命令。 git

lldb help
lldb help

這裏大概會有30個命令吧,我記得我第一次裝的時候沒那麼多命令的,facebook又更新了不少。其實這些封裝的命令,就是使用python封裝了一下函數而後調用。凡是這些封裝的命令,你均可以經過多個lldb命令打出來,因此若是你會使用python的話,那麼你能夠根據本身的使用習慣封裝一些經常使用的lldb命令。我使用了也有一段時間的chisel了,可是感受並非全部的命令都很經常使用,並且有寫使用的場景也不是很清楚,因此在這裏給你們普及一下,若是有謬誤,請你們及時指正。(ps:和你們說個快捷鍵,cmd+k快速清楚console的信息。) github

通常咱們使用chisel的命令的時候,咱們能夠經過 help + chisel命令,譬如 help + pvc,獲得如何具體使用這個命令,可是有時候你看了help信息也不必定就會用呢。 正則表達式

image
image

pviews

這個命令是我最常使用的命令。它可以幫助咱們看到view的層級,即便咱們並無觸發到一個斷點。操做以下: express

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 添加邊框顏色和邊框的寬度,使用以下: bash

border 0x79ec3140 -c green -w 2 app

border這個命令經常在咱們須要查看邊框的邊緣的問題,經常用到,並且咱們想要設置的直接在lldb中設置,徹底不須要從新寫代碼再次運行。我就是經過直接暫停程序,而且經過pviews命令找到的控件的地址,而且調用命令顯示的。當咱們不須要的時候能夠經過unborder這個命令去掉邊框。整個過程一鼓作氣。 ide

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. vs,fv,fvc,這幾個命令都須要正則表達式的知識背景,由於我正則表達式歷來都是百度,也沒本身真正學過。因此對我不經常使用,可是對那些會正則的可能會很大做用。(ps:但願大家研究出來有什麼好的技巧分享下)

參考

  1. 南峯子的技術博客,工具篇:LLDB調試器
  2. Dancing in the Debugger — A Waltz with LLDB
  3. LLDB調試命令初探
  4. Xcode LLDB Debug教程

我寫的這些關於lldb的東西只是九牛一毛,它能夠作的事情特別多,上面的參考都是我看過的比較好的lldb的知識,你們瞭解能夠經過我上面的一些網站,更加深刻的第三篇,我一時半會不會寫的,由於那個纔是真正的進階,而我還沒達到那種高度,若是你也有好的關於lldb的技巧,理解之類的,歡迎分享。

相關文章
相關標籤/搜索