一、概述
debugserver、lldb
是協同工作的,debugserver
依附在APP
上,時刻監聽APP
的運行狀態,並有控制APP
執行的能力;lldb
是在APP
外部的,可以和debugserver
建立連接,通過debugserver
獲取APP
運行狀態,並且能通知debugserver
對APP
做一些事情。在真機調試的時候,Xcode
將debugserver
加入到APP
中,通過lldb
來調試APP
,那麼同樣也可以在iterm
上對越獄手機上的任意APP
進行調試。
Mac(Xcode(lldb)) -> APP(debugserver)
二、debugserver位置
Xcode
中debugserver
的位置:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/13.2
如下圖:
雙擊dmg
查看debugserver
位置:/usr/bin/debugserver
如下圖:
知道debugserver
的位置後,可以使用該工具scp
到越獄手機上,附加到任意應用。
三、越獄手機調試環境配置
1、處理Xcode中獲取手機對應版本的debugserver
工具
查看描述文件:
ldid -e debugserver
導出描述文件:
ldid -e debugserver > debuger.entitlements
在描述文件中新增get-task-allow、task_for_pid-allow
字段設置爲YES
使用描述文件對debugserver
工具進行重簽名:
ldid -Sdebuger.entitlements debugserver
簽名後的debugserver
就可以用到越獄手機上調試了。
使用scp
工具將debugserver
傳入到越獄手機中:
scp -r debugserver root@10.15.32.45:/usr/bin/
2、越獄手機啓動debugserver
服務
debugserver ip:port –a app
ip
對應的手機ip
直接使用*,port
爲對外開放的端口號(可以自定義)app
爲要附加的應用名稱。
查看進程:
ps -A
將debugserver
附加到微信進程上:
debugserver *:12345 –a WeChat
3、使用Mac終端啓動lldb和越獄手機上的debugserver建立連接
在終端運行lldb
,連接debugserver
:
process connect connect://127.0.01:12345
這樣就連接上了,可使用lldb
來調試越獄手機上的應用。
注意:在手機的
/Developer/usr/bin/
中也存在手機對應的debugserver
工具,同上我們可以將該debugserver
傳到電腦上,重簽名後再回傳到手機/usr/bin/
。
四、lldb常用命令
breakpoint使用
1、下斷點
breakpoint set --name test1
或
breakpoint set -n test1
打印:
Breakpoint 2: where = LLDB`-[ViewController test1] + 23 at ViewController.m:25:5, address = 0x0000000109de9f97
斷點位置信息,執行便能在該處斷住。
連續下多個斷點:
breakpoint set -n "-[ViewController save:]" -n "-[ViewController pause:]" -n "-[ViewController continues:]"
運行c
繼續運行,n
單步執行,s
進入函數內部執行,finish執行到函數尾部。
2、查看斷點列表
breakpoint list
打印:
1: file = '/Users/hibo/Documents/test/LLDB/LLDB/ViewController.m', line = 21, exact_match = 0, locations = 1 Options: disabled
1.1: where = LLDB`-[ViewController touchesBegan:withEvent:] + 70 at ViewController.m:22:6, address = 0x0000000109de9f46, unresolved, hit count = 2 Options: disabled
2: name = 'test1', locations = 1, resolved = 1, hit count = 7
2.1: where = LLDB`-[ViewController test1] + 23 at ViewController.m:25:5, address = 0x0000000109de9f97, resolved, hit count = 7
3、禁用斷點
breakpoint disable //禁用所有斷點
breakpoint disable 1.1 //禁用第一個斷點
4、啓用斷點
breakpoint enable //啓用所有斷點
breakpoint enable 1.1 //啓用1處斷點
5、刪除所有斷點
breakpoint delete
breakpoint delete 1
刪除只能刪除一組,不能單個刪除
6、設置selector
breakpoint set --selector touchesBegan:withEvent:
將爲所有該方法設置斷點
7、設置文件中的selector
斷點
breakpoint set --file ViewController.m --selector touchesBegan:withEvent:
8、設置帶有相同字符串的方法斷點
breakpoint set -r Game:
打印:
Current breakpoints:
1: regex = 'Game:', locations = 3, resolved = 3, hit count = 0
1.1: where = LLDB`-[ViewController pauseGame:] + 43 at ViewController.m:31:5, address = 0x00000001010dff0b, resolved, hit count = 0
1.2: where = LLDB`-[ViewController continueGame:] + 43 at ViewController.m:34:5, address = 0x00000001010dff5b, resolved, hit count = 0
1.3: where = LinkPresentation`-[LPGameCenterInvitationMetadata setGame:], address = 0x00007fff2733e5e9, resolved, hit count = 0
如上也給其他帶有Game
字符的類下了斷點。
給某一個文件下的帶有相同字符串的方法下斷點:
breakpoint set --file ViewController.m -r Game
簡寫:
breakpoint->b
打印列表需要寫全:breakpoint list
或者break list
bt、frame命令
1、查看函數相關信息,使用p、down
追蹤函數的調用和被調用關係
frame select
使用bt
命令查看函數調用堆棧
2、查找方法的調用者及方法名稱
frame variable
methods、pviews
1、methods
打印當前對象的屬性和方法
methods self
2、pviews
打印當前視圖的層級結構
以上兩個命令是lldb
插件名中的命令。chisel安裝
……