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

這里大概會(huì)有30個(gè)命令吧壳坪,我記得我第一次裝的時(shí)候沒(méi)那么多命令的玻募,facebook又更新了很多。其實(shí)這些封裝的命令,就是使用python封裝了一下函數(shù)然后調(diào)用。凡是這些封裝的命令,你都可以通過(guò)多個(gè)lldb命令打出來(lái)丰泊,所以如果你會(huì)使用python的話(huà),那么你可以根據(jù)自己的使用習(xí)慣封裝一些常用的lldb命令始绍。我使用了也有一段時(shí)間的chisel了瞳购,但是感覺(jué)并不是所有的命令都很常用,而且有寫(xiě)使用的場(chǎng)景也不是很清楚亏推,所以在這里給大家普及一下学赛,如果有謬誤,請(qǐng)大家及時(shí)指正吞杭。(ps:和大家說(shuō)個(gè)快捷鍵盏浇,cmd+k快速清楚console的信息。)
一般我們使用chisel的命令的時(shí)候芽狗,我們可以通過(guò) help + chisel命令绢掰,譬如 help + pvc,得到如何具體使用這個(gè)命令童擎,但是有時(shí)候你看了help信息也不一定就會(huì)用呢滴劲。

pviews
這個(gè)命令是我最常使用的命令。它能夠幫助我們看到view的層級(jí)顾复,即使我們并沒(méi)有觸發(fā)到一個(gè)斷點(diǎn)班挖。操作如下:

- 如圖我沒(méi)有設(shè)置任何斷點(diǎn),只是點(diǎn)擊控制臺(tái)的暫停圖標(biāo)芯砸,就可以呼出lldb控制臺(tái)了萧芙。然后再這里輸出pviews這個(gè)命令给梅。
- 然后這個(gè)命令主要可以看到當(dāng)前的view層級(jí),如果我們寫(xiě)了一個(gè)控件沒(méi)有顯示双揪。我們就可以通過(guò)這個(gè)命令來(lái)排查破喻。
- 排查首先看有沒(méi)有我們添加的這個(gè)view,如button,如果內(nèi)存地址里沒(méi)有這個(gè)button盟榴,說(shuō)明沒(méi)有添加到view中(沒(méi)調(diào)用addSubview方法)
- 然后可以看到這個(gè)button的地址,我們可以看到這個(gè)button的frame屬性婴噩,根據(jù)屬性判斷是否是位置或者大小不合適擎场。
- 再次,我們要看是否hidden被設(shè)置成了yes几莽,如果設(shè)置了yes的話(huà)迅办,在打印信息中會(huì)打印出來(lái)。因?yàn)槟J(rèn)view的isHidden是no,所以沒(méi)被打印章蚣。
- 最后如果是button可以檢查下是否設(shè)置了圖片站欺,如果是view,就可以查看下顏色是否與后面的控件一致纤垂,這就引入到了下一個(gè)命令border矾策。
border&unborder

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

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

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

hide&show
hide命令可以直接隱藏一個(gè)對(duì)象,移除當(dāng)前遮擋的對(duì)象便于你觀察后面的對(duì)象岳掐。show命令會(huì)讓它再次顯示出來(lái)。
bmessage
這個(gè)命令就是lldb添加一個(gè)斷點(diǎn)饭耳,譬如-viewWillAppear:這個(gè)方法串述,在當(dāng)前控制器中你沒(méi)有實(shí)現(xiàn)它,但是你又想在調(diào)用它的時(shí)機(jī)觸發(fā)中斷寞肖。
Arguments:
<expression>; Type: string; Expression to set a breakpoint on, e.g. "-[MyView setFrame:]", "+[MyView awesomeClassMethod]" or "-[0xabcd1234 setFrame:]"
這個(gè)我就不解釋了纲酗,需要補(bǔ)充一點(diǎn)的是oc的方法是帶:
的。
其他命令
其它命令我用著并不是太多新蟆,并不代表他們不常用觅赊。只是我用的不太好而已,而且我認(rèn)為用到是需要特殊的場(chǎng)景的琼稻,這個(gè)里說(shuō)幾個(gè)我感覺(jué)有很大作用但是我用的又不好的茉兰。
-
wivar
,這個(gè)命令是加watchPoint,用的好欣簇,就相當(dāng)于使用lldb寫(xiě)了kvo了规脸。(ps:恕我沒(méi)研究明白) -
pvc
這個(gè)命令的作用是打印出當(dāng)前的控制器層級(jí),(ps:有時(shí)好使熊咽,有時(shí)又很壞莫鸭,似魔鬼的步伐.??,沒(méi)研究明白) -
vs
横殴,fv
,fvc
被因,這幾個(gè)命令都需要正則表達(dá)式的知識(shí)背景,因?yàn)槲艺齽t表達(dá)式從來(lái)都是百度衫仑,也沒(méi)自己真正學(xué)過(guò)梨与。所以對(duì)我不常用,但是對(duì)那些會(huì)正則的可能會(huì)很大作用文狱。(ps:希望你們研究出來(lái)有什么好的技巧分享下)
參考
- 南峰子的技術(shù)博客粥鞋,工具篇:LLDB調(diào)試器
- Dancing in the Debugger — A Waltz with LLDB
- LLDB調(diào)試命令初探
- Xcode LLDB Debug教程
我寫(xiě)的這些關(guān)于lldb的東西只是九牛一毛,它可以做的事情特別多瞄崇,上面的參考都是我看過(guò)的比較好的lldb的知識(shí)呻粹,大家了解可以通過(guò)我上面的一些網(wǎng)站壕曼,更加深入的第三篇,我一時(shí)半會(huì)不會(huì)寫(xiě)的等浊,因?yàn)槟莻€(gè)才是真正的進(jìn)階腮郊,而我還沒(méi)達(dá)到那種高度,如果你也有好的關(guān)于lldb的技巧筹燕,理解之類(lèi)的轧飞,歡迎分享。