LLDB命令的語法有其通用結(jié)構(gòu)近速,通常是以下形式的:
<command></command>[<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]</action></subcommand></subcommand>
其中:
(命令)和(子命令):LLDB調(diào)試命令的名稱低缩。命令和子命令按層級(jí)結(jié)構(gòu)來排列:一個(gè)命令對(duì)象為跟隨其的子命令對(duì)象創(chuàng)建一個(gè)上下文,子命令又為其子命令創(chuàng)建一個(gè)上下文涩禀,依此類推料滥。
LLBD命令行的解析操作在執(zhí)行命令之前完成。上面的這些元素之間通過空格來分割艾船,如果某一元素自身含有空格葵腹,則可以使用雙引用。而如果元素中又包含雙引號(hào)屿岂,則可以使用反斜杠践宴;或者元素使用單引號(hào)。如下所示:
(lldb) command [subcommand] -option "some \"quoted\" string"
(lldb) command [subcommand] -option 'some "quoted" string'
一般開發(fā)時(shí)候用的最多的情況應(yīng)該就是打斷點(diǎn)爷怀,然后打印當(dāng)前變量的值了吧阻肩。
打斷點(diǎn)的命令就不說了,反正大多數(shù)人都是直接在代碼里面添加斷點(diǎn)的运授】揪基本打印變量的值比較常見的就這幾個(gè)命令print、po吁朦、frame柒室、exp。
- print 該命令可以用來打印基本類型(int之類的)逗宜,如果打印的是對(duì)象雄右,還會(huì)打印出對(duì)象的指針地址
- po 這個(gè)是print object命令的縮寫,僅僅是用來打印對(duì)象的值纺讲,但是用的最多
- exp 該命令不僅有print類似的功能擂仍,而且它還能改寫對(duì)象的值,多數(shù)用在測(cè)試數(shù)據(jù)的時(shí)候修改傳入的參數(shù)刻诊。
- frame 該命令我用的比較少防楷,知道的僅有frame variable命令可以打印變量的值牺丙,以及frame select命令可以打印出當(dāng)前的代碼幀则涯。有興趣的可以自行查閱
不知道蘋果是不是優(yōu)化了模擬器复局,以前使用exp self.view.backgroundColor = [UIColor greenColor]
改變背景顏色的時(shí)候,還需要加exp (void)[CATransaction flush]
命令才能生效粟判,現(xiàn)在用的Xcode9.3亿昏,執(zhí)行之后直接就改變了。
另外一個(gè)常用的命令是image
命令
-
image list
可以打印出工程中使用的庫 -
image lookup --address
后面帶上崩潰的內(nèi)存地址档礁,可以具體定位到具體崩潰的代碼位置
一些好玩的方法
1角钩、push一個(gè)控制器
首先獲取導(dǎo)航控制器
exp id $nvc = [[[UIApplication sharedApplication] keyWindow] rootViewController]
然后創(chuàng)建一個(gè)新的控制器
exp id $vc = [UIViewController new]
為新的控制器設(shè)計(jì)背景色
exp (void)[[$vc view] setBackgroundColor:[UIColor yellowColor]]
最后跳轉(zhuǎn)該控制器
exp (void)[$nvc pushViewContoller:$vc animated:YES]
(在Xcode9.3的時(shí)候,輸入完上述命令繼續(xù)運(yùn)行就會(huì)直接跳轉(zhuǎn)呻澜,如果沒有递礼,那么請(qǐng)?jiān)诤竺嫣砑?code>exp (void)[CATransaction flush]命令吧)
一些問題
不明類型或類型不匹配
p NSLog(@"%@",[self.view viewWithTag:1001])
error: 'NSLog' has unknown return type; cast the call to its declared return type
如果在使用LLDB命令中發(fā)現(xiàn)有 unknown type 的類似錯(cuò)誤(多見于id類型,比如NSArray中某個(gè)值)羹幸,那我們就必須顯式聲明類型脊髓。比如上面這個(gè)命令,我們得這么修改栅受。
p (void)NSLog(@"%@",[self.view viewWithTag:1001])
這樣就能得到正確的結(jié)果了将硝。 另外,lldb是不支持宏的屏镊,需要我們自己替換依疼。
找不到方法
常見于輸出frame的時(shí)候。比如你可能會(huì)得到以下的錯(cuò)誤信息:
po self.view.frame
error: unsupported expression with unknown type
這似乎是lldb的一個(gè)bug而芥,無法通過點(diǎn)屬性訪問的方法打印framework里面的對(duì)象律罢,但是自己在app里面定義的就可以。我們把上面的命令改動(dòng)一下:
p (CGRect)[self.view frame]
就可以了