概述
LLDB是LLVM下的調(diào)試器。Xcode4.0開始,編譯器開始使用LLVM,相應的調(diào)試器也從gdb改為LLDB。Xcode5.0之后所有工程均自動設置為使用LLDB
常用命令
help
-
help
列出所有命令 -
help
<commond>列出某個命令更多細節(jié),例如help print
print
打印需要查看的變量,例如print number
,簡寫為p
po(print object)
可以打印對象的description方法的結(jié)果-
打印不同格式可以用
p/x number
打印16進制,p/t number
打印2進制,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
可以改變一個值,簡寫e
(lldb) expression i (Int) $R7 = 1 (lldb) expression i = 5 (lldb) p i (Int) $R9 = 5 (lldb)
-
e -o -- object
可以打印一個對象,別名是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用*
標出了重要信息語句,我們只需要看前面帶*
的語句就可以知道crash的原因是下標越界和發(fā)生的地方是ViewController中的第18行,我們只需要查看這行代碼就行了
-
thread return
:讓代碼停止執(zhí)行某個方法或者直接返回一個想要的值
流程控制
當我們在調(diào)試程序的時候,我們經(jīng)常用下面這4個按鈕:
屏幕快照 2018-01-06 上午10.51.47.png
我們可以通過LLDB命令來完成上面的操作
-
c/continue/thread continue
: 這三個命令效果都等同于上圖中第一個按鈕的。表示程序繼續(xù)運行 -
n/next/thread step-over
: 這三個命令效果等同于上圖第二個按鈕。表示單步運行 -
s/step/thread step-in
: 這三個命令效果等同于上圖第三個按鈕。表示進入某個方法 -
finish/step-out
: 這兩個命令效果等同于第四個按鈕。表示直接走完當前方法,返回到上層frame
斷點管理
-
breakpoint list
可以看到所有斷點,簡寫br li
-
breakpoint set
可以創(chuàng)建斷點,簡寫br
在調(diào)試器中直接更新UI
call view.backgroundColor = UIColor.blue
繼續(xù)運行之后就可以看到界面的變化
打印UI所有層級屬性
po let s = UIApplication.shared.keyWindow?.perform("recursiveDescription"); print(s)