Xcode動(dòng)態(tài)調(diào)試原理
動(dòng)態(tài)調(diào)試就是將程序運(yùn)行起來(lái),通過(guò)下斷點(diǎn)、打印等方式查看參數(shù)十性、返回值、函數(shù)調(diào)用流程等塑悼。
Xcode的調(diào)試器發(fā)展歷程:GDB -> LLDB ,LLDB 是基于GDB開(kāi)發(fā)的劲适。
debugserver 是配合LLDB做動(dòng)態(tài)調(diào)試必不可少的程序,必須將debugserver放入到手機(jī)中才能起作用厢蒜。當(dāng)Xcode識(shí)別到手機(jī)設(shè)備時(shí)霞势,Xcode會(huì)自動(dòng)將debugserver安裝到iphone上 /Developer/usr/bin/debugserver ,該bin目錄下的文件是只讀的,不能修改斑鸦。
Xcode真機(jī)調(diào)試流程:
1.Xcode打開(kāi)項(xiàng)目愕贡;
2.通過(guò)數(shù)據(jù)線鏈接手機(jī);
3.在需要的地方添加斷點(diǎn)巷屿;
4.點(diǎn)擊run,將程序跑到手機(jī)上固以;
Xcode會(huì)自動(dòng)將LLDB連接到手機(jī)上的debugserver上,debugserver也會(huì)與當(dāng)前運(yùn)行程序建立鏈接嘱巾。
LLDB下發(fā)指令傳輸?shù)绞謾C(jī)上的debugserver憨琳,debugserver通過(guò)監(jiān)聽(tīng)APP運(yùn)行進(jìn)程下發(fā)指令,APP執(zhí)行了命令后將結(jié)果返回debugserver浓冒,debugserver再傳輸給LLDB栽渴,最總有LLDB將結(jié)果打印在控制臺(tái)上尖坤。
Xcode動(dòng)態(tài)調(diào)試的局限性:只能調(diào)試通過(guò)Xcode安裝的APP稳懒。
動(dòng)態(tài)調(diào)試任意APP
1.制作調(diào)試任意APP的debugserver,Xcode幫我們自動(dòng)生成的只能調(diào)試Xcode運(yùn)行的APP,不能調(diào)試其他的APP场梆。將手機(jī)/Developer/usr/bin/中的debugserver拷貝到桌面墅冷。
2.對(duì)debugserver進(jìn)行權(quán)限簽名,需要添加能夠調(diào)試任意APP的權(quán)限或油。
3.使用ldid 導(dǎo)出debugserver的權(quán)限文件并添加權(quán)限寞忿。
ldid -e debugserver > debugserver.entitlements
//將下面2個(gè)權(quán)限添加到debugserver.entitlements中
get-task-allow : YES
task_for_pid-allow : YES
4.使用ldid 進(jìn)行對(duì)添加的權(quán)限簽名,然后將簽名后的debugserver拷貝到手機(jī)的/usr/bin目錄下
ldid -Sdebugserver.entitlements debugserver
5.debugserver 監(jiān)聽(tīng)微信APP 進(jìn)程
debugserver *:10011 -a WeChat
6.連接debugserver服務(wù)
(lldb) process connect connect://手機(jī)IP地址:debugserver服務(wù)端口號(hào)
# 使用Python 腳本去映射
# 這里用的是手機(jī)的10011端口映射電腦的10011端口, 這樣就可以直接使用電腦的10011端口了
process connect connect://localhost:10011