這次真是久違的第二篇了,過年的時候一直在幫家里帶孩子,順便用webStorm這個神器重新溫習(xí)了下前端的知識。然后最近剛來北京又是重感冒,又是找房子,整個來說coding還是寫博客效率極低又苦不堪言。
首先如果使用lldb,最好你要學(xué)著使用chisel來提高效率,否則你會浪費很多的時間,除非你自己會寫python腳本,自己封裝一些lldb的命令。
安裝chisel
chisel的安裝是十分簡單,它是在終端通過brew安裝的,具體可以點擊鏈接參考github的安裝說明,唯一需要注意的一點就是命令行安裝完之后,它會在安裝完之后顯示出chisel的安裝地址path.在執(zhí)行下面的命令時候要記得替換/path/to/fblldb.py這一塊。
# ~/.lldbinit
...
command script import /path/to/fblldb.py
script fblldb.loadCommandsInDirectory('/magical/
commands/')
如果安裝成功的話,那么你就會看到如下圖的這些命令。

這里大概會有30個命令吧,我記得我第一次裝的時候沒那么多命令的,facebook又更新了很多。其實這些封裝的命令,就是使用python封裝了一下函數(shù)然后調(diào)用。凡是這些封裝的命令,你都可以通過多個lldb命令打出來,所以如果你會使用python的話,那么你可以根據(jù)自己的使用習(xí)慣封裝一些常用的lldb命令。我使用了也有一段時間的chisel了,但是感覺并不是所有的命令都很常用,而且有寫使用的場景也不是很清楚,所以在這里給大家普及一下,如果有謬誤,請大家及時指正。(ps:和大家說個快捷鍵,cmd+k快速清楚console的信息。)
一般我們使用chisel的命令的時候,我們可以通過 help + chisel命令,譬如 help + pvc,得到如何具體使用這個命令,但是有時候你看了help信息也不一定就會用呢。

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

- 如圖我沒有設(shè)置任何斷點,只是點擊控制臺的暫停圖標(biāo),就可以呼出lldb控制臺了。然后再這里輸出pviews這個命令。
- 然后這個命令主要可以看到當(dāng)前的view層級,如果我們寫了一個控件沒有顯示。我們就可以通過這個命令來排查。
- 排查首先看有沒有我們添加的這個view,如button,如果內(nèi)存地址里沒有這個button,說明沒有添加到view中(沒調(diào)用addSubview方法)
- 然后可以看到這個button的地址,我們可以看到這個button的frame屬性,根據(jù)屬性判斷是否是位置或者大小不合適。
- 再次,我們要看是否hidden被設(shè)置成了yes,如果設(shè)置了yes的話,在打印信息中會打印出來。因為默認(rèn)view的isHidden是no,所以沒被打印。
- 最后如果是button可以檢查下是否設(shè)置了圖片,如果是view,就可以查看下顏色是否與后面的控件一致,這就引入到了下一個命令border。
border&unborder

這個命令可以直接給border 添加邊框顏色和邊框的寬度,使用如下:
border 0x79ec3140 -c green -w 2
border這個命令常常在我們需要查看邊框的邊緣的問題,常常用到,而且我們想要設(shè)置的直接在lldb中設(shè)置,完全不需要重新寫代碼再次運行。我就是通過直接暫停程序,并且通過pviews命令找到的控件的地址,并且調(diào)用命令顯示的。當(dāng)我們不需要的時候可以通過unborder
這個命令去掉邊框。整個過程一氣呵成。
pinternals

這個命令就是打印出來的一個控件(id
)類型的內(nèi)部結(jié)構(gòu),詳細(xì)到令人發(fā)指!甚至是你自定義的控件中的類型,譬如這個styleView
就是我自定義的,內(nèi)部有個iconView的屬性,其中的值它也會打印出來。好處,你們自己琢磨吧。(ps:這個demo,我會在下一篇博客中放出來,下篇博客是說transform的。
presponder
打印出一個集成于UIResponder控件的消息傳遞鏈。

這個也方便我們了解消息是如何傳遞的,打印的時候是倒敘打印的。
visualize
可以使用mac下的預(yù)覽app打開我們的圖片UIImage, CGImageRef格式的圖片,甚至view和layer的圖片 。
visualize 0x79ec3140//或者變量名,此地址是id類型的
pclass
pclass可以打印出一個對象的繼承關(guān)系。
taplog
這個命令是模擬敲擊一下屏幕,并且打印出你敲擊屏幕時候事件接收的對象。

hide&show
hide命令可以直接隱藏一個對象,移除當(dāng)前遮擋的對象便于你觀察后面的對象。show命令會讓它再次顯示出來。
bmessage
這個命令就是lldb添加一個斷點,譬如-viewWillAppear:這個方法,在當(dāng)前控制器中你沒有實現(xiàn)它,但是你又想在調(diào)用它的時機(jī)觸發(fā)中斷。
Arguments:
<expression>; Type: string; Expression to set a breakpoint on, e.g. "-[MyView setFrame:]", "+[MyView awesomeClassMethod]" or "-[0xabcd1234 setFrame:]"
這個我就不解釋了,需要補充一點的是oc的方法是帶:
的。
其他命令
其它命令我用著并不是太多,并不代表他們不常用。只是我用的不太好而已,而且我認(rèn)為用到是需要特殊的場景的,這個里說幾個我感覺有很大作用但是我用的又不好的。
-
wivar
,這個命令是加watchPoint,用的好,就相當(dāng)于使用lldb寫了kvo了。(ps:恕我沒研究明白) -
pvc
這個命令的作用是打印出當(dāng)前的控制器層級,(ps:有時好使,有時又很壞,似魔鬼的步伐.??,沒研究明白) -
vs
,fv
,fvc
,這幾個命令都需要正則表達(dá)式的知識背景,因為我正則表達(dá)式從來都是百度,也沒自己真正學(xué)過。所以對我不常用,但是對那些會正則的可能會很大作用。(ps:希望你們研究出來有什么好的技巧分享下)
參考
- 南峰子的技術(shù)博客,工具篇:LLDB調(diào)試器
- Dancing in the Debugger — A Waltz with LLDB
- LLDB調(diào)試命令初探
- Xcode LLDB Debug教程
我寫的這些關(guān)于lldb的東西只是九牛一毛,它可以做的事情特別多,上面的參考都是我看過的比較好的lldb的知識,大家了解可以通過我上面的一些網(wǎng)站,更加深入的第三篇,我一時半會不會寫的,因為那個才是真正的進(jìn)階,而我還沒達(dá)到那種高度,如果你也有好的關(guān)于lldb的技巧,理解之類的,歡迎分享。