動態調試就是在咱們的程序運行之時,經過下斷點、打印等一系列方式查看參數、返回值、函數調用流程等等。不只是在iOS開放中須要動態調試,在任何語言的開發過程當中都須要用到動態調試python
可使用終端取代Xcode來對App進行動態調試正則表達式
ldid -e debugserver > debugserver.entitlements
複製代碼
ldid -Sdebugserver.entitlements debugserver
複製代碼
chmod +x /usr/bin/debugserver
複製代碼
#查看權限基本信息
codesign -d --entitlements - debugserver
#簽名權限
codesign -f -s - --entitlements debugserver.entitlements debugserver
#也能夠簡寫爲
codesign -fs - --entitlements debugserver.entitlements debugserver
複製代碼
debugserver *:端口號 -a 進程
複製代碼
*:端口號:表示使用iPhone上的某個端口啓動debugserver服務(注意:不能使用保留端口號)
-a 進程:指定進程id或者進程名稱express
debugserver -x auto *:端口號 App可執行文件路徑
複製代碼
在以前的學習中,咱們知道可使用iPhone的ip地址來鏈接手機,可是這樣須要保證手機和電腦在同一個wifi下,而且使用這種方式傳輸數據十分緩慢。因此,一般的作法是經過usb鏈接iPhone,將iPhone上的某個端口映射到Mac上的某個端口,而後然LLDB和Mac上的端口通訊便可xcode
python ./usbmuxd/tcprelay.py -t 22:10088 9999:10089
複製代碼
此處的10089端口能夠任意定義,只要不使用保留端口號便可。使用10088端口映射22端口,是爲了和iPhone進行SSH通訊bash
debugserver *:9999 -a live4iphone
複製代碼
➜ ~ lldb
(lldb)
複製代碼
process connect connect://localhost:10089
複製代碼
(lldb) c
Process 635 resuming
複製代碼
<command> [<subcommand> [<subcommand>...]] <action> [-options [option- value]] [argument [argument...]]
複製代碼
對應着app
命令 子命令 命令操做 命令選項 命令參數
複製代碼
例如給test這個函數設置斷點:iphone
breakpoint set -n test
複製代碼
help指令能夠幫助咱們快速查找LLDB指令的使用方法tcp
help breakpoint
help breakpoint set
複製代碼
expression指令被用來執行一個表達式函數
expression self.view.backgroundColor = [UIColor redColor]
//或者
expression -- self.view.backgroundColor = [UIColor redColor]
複製代碼
expression後的 -- 表示命令選項結束符,表示全部的命令選項已經設置完畢,若是沒有命令選項,--能夠省略。若是expression以後有命令選項,則--不能省略。工具
==thread backtrace==指令的做用是打印線程的堆棧信息,效果和 ==bt== 的效果相同。
(lldb) thread backtrace
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
* frame #0: 0x0000000102d4d61d TestFont`-[ViewController touchesBegan:withEvent:](self=0x00007fd2f86066d0, _cmd="touchesBegan:withEvent:", touches=1 element, event=0x00006000036d4ab0) at ViewController.m:26
frame #1: 0x0000000106f6f8e8 UIKitCore`forwardTouchMethod + 353
......
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
* frame #0: 0x0000000102d4d61d TestFont`-[ViewController touchesBegan:withEvent:](self=0x00007fd2f86066d0, _cmd="touchesBegan:withEvent:", touches=1 element, event=0x00006000036d4ab0) at ViewController.m:26
frame #1: 0x0000000106f6f8e8 UIKitCore`forwardTouchMethod + 353
......
複製代碼
讓函數返回某個值,不會執行以後的代碼。若是函數有返回值,在後面跟上返回值,若是函數沒有返回值,就直接使用thread return便可
打印當前棧幀的變量
如下指令從左到右依次表示:指令全稱、指令簡稱、極簡指令
si、ni和s、n指令相似,可是s、n是源碼級別,si、ni是彙編指令級別。每一句OC代碼會有一條或多條彙編指令構成,s、n指令表示一步一步執行每一句OC代碼,而si、ni表示一步一步執行彙編指令。
設置斷點
此處跟上正則表達式,會將全部匹配到的方法都加上斷點
列出全部的斷點,每一個斷點都有單獨的編號
禁用斷點
啓用斷點
刪除斷點
給指定斷點編號的斷點預先設置須要執行的命令,到觸發斷點時,就會按順序執行預先設置的命令
查看某個編號的斷點全部預先設置的命令
刪除指定編號斷點的全部預設命令
給指定的內存下斷點,當內存中的數據發生改變時會觸發
對指定的變量設置內存斷點,當變量值改變的時候會觸發
watchpoint set variable self->_age
複製代碼
注意:此處不能使用self.age
對指定內存地址設置斷點,做用和watchpoint set variable相同
列出全部的內存斷點
禁用內存斷點
啓用內存斷點
刪除內存斷點
給指定斷點編號的內存斷點預先設置須要執行的命令,到觸發內存斷點時,就會按順序執行預先設置的命令
查看某個編號的內存斷點全部預先設置的命令
刪除指定編號內存斷點的全部預設命令
模塊查詢指令
列出全部所加載的模塊信息
(lldb) breakpoint list
(lldb) br li
(lldb) br l
(lldb) breakpoint set -n test
(lldb) br s -n test
複製代碼