概述
LLDB是LLVM下的調(diào)試器。Xcode4.0開始,編譯器開始使用LLVM,相應(yīng)的調(diào)試器也從gdb改為L(zhǎng)LDB。Xcode5.0之后所有工程均自動(dòng)設(shè)置為使用LLDB
常用命令
help
-
help列出所有命令 -
help<commond>列出某個(gè)命令更多細(xì)節(jié),例如help print
print打印需要查看的變量,例如print number,簡(jiǎn)寫為ppo(print object)可以打印對(duì)象的description方法的結(jié)果-
打印不同格式可以用
p/x number打印16進(jìn)制,p/t number打印2進(jìn)制,p/c char打印字符(lldb) e i = 10 (lldb) p i (Int) $R1 = 10 (lldb) p/x i (Int) $R2 = 0x000000000000000a (lldb) p/t i (Int) $R3 = 0b0000000000000000000000000000000000000000000000000000000000001010 (lldb) p/c "eeee" (String) $R4 = "eeee" (lldb)
expression
-
expression可以改變一個(gè)值,簡(jiǎn)寫e(lldb) expression i (Int) $R7 = 1 (lldb) expression i = 5 (lldb) p i (Int) $R9 = 5 (lldb) -
e -o -- object可以打印一個(gè)對(duì)象,別名是po(lldb) e -o -- view ? Optional<UIView> (lldb) po view ? Optional<UIView>
thread
-
thread backtrace:作用是將線程的堆棧打印出來,別名bt
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = Fatal error: Index out of range
frame #0: 0x0000000106a39900 libswiftCore.dylib`_swift_runtime_on_report
...
frame #7: 0x0000000107202d79 libswiftSwiftOnoneSupport.dylib`generic specialization <preserving fragile attribute, Swift.Int> of Swift.Array.subscript.getter : (Swift.Int) -> A + 89
* frame #8: 0x00000001033a2659 LLDBDebug`ViewController.viewDidLoad(self=0x00007f9c9ff19ba0) at ViewController.swift:18
LLDB用*標(biāo)出了重要信息語句,我們只需要看前面帶*的語句就可以知道crash的原因是下標(biāo)越界和發(fā)生的地方是ViewController中的第18行,我們只需要查看這行代碼就行了
-
thread return:讓代碼停止執(zhí)行某個(gè)方法或者直接返回一個(gè)想要的值
流程控制
當(dāng)我們?cè)谡{(diào)試程序的時(shí)候,我們經(jīng)常用下面這4個(gè)按鈕:

屏幕快照 2018-01-06 上午10.51.47.png
我們可以通過LLDB命令來完成上面的操作
-
c/continue/thread continue: 這三個(gè)命令效果都等同于上圖中第一個(gè)按鈕的。表示程序繼續(xù)運(yùn)行 -
n/next/thread step-over: 這三個(gè)命令效果等同于上圖第二個(gè)按鈕。表示單步運(yùn)行 -
s/step/thread step-in: 這三個(gè)命令效果等同于上圖第三個(gè)按鈕。表示進(jìn)入某個(gè)方法 -
finish/step-out: 這兩個(gè)命令效果等同于第四個(gè)按鈕。表示直接走完當(dāng)前方法,返回到上層frame
斷點(diǎn)管理
-
breakpoint list可以看到所有斷點(diǎn),簡(jiǎn)寫br li -
breakpoint set可以創(chuàng)建斷點(diǎn),簡(jiǎn)寫br
在調(diào)試器中直接更新UI
call view.backgroundColor = UIColor.blue
繼續(xù)運(yùn)行之后就可以看到界面的變化
打印UI所有層級(jí)屬性
po let s = UIApplication.shared.keyWindow?.perform("recursiveDescription"); print(s)