十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
本篇文章給大家分享的是有關(guān)iOS中怎么實(shí)現(xiàn)動(dòng)態(tài)調(diào)試,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)公司、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了果洛州免費(fèi)建站歡迎大家使用!
Xcode的動(dòng)態(tài)調(diào)試原理
首先了解一下 Xcode 編譯和調(diào)試器的發(fā)展。Xcode 中的編譯器發(fā)展歷程:GCC -> LLVM,調(diào)試器的發(fā)展歷程:GDB -> LLDB 。
Xcode 調(diào)試安裝到手機(jī)上的應(yīng)用的原理:Xcode 通過(guò) LLDB 調(diào)試器把調(diào)試指令發(fā)送到手機(jī)上的 debugserver, debugserver 再與相應(yīng)的 APP 進(jìn)行交互,達(dá)到調(diào)試的效果。
debugserver 一開始是存放在Mac的Xcode里面,路徑:
/Applications/Xcode.app/Contents/Developer/Platforms /iPhoneOS.platform/DeviceSupport /9.1/DeveloperDiskImage.dmg /usr/bin/debugserver
當(dāng) Xcode 識(shí)別到手機(jī)設(shè)備時(shí),Xcode 會(huì)自動(dòng)將 debugserver 安裝到手機(jī)上。
Xcode 調(diào)試的局限性:一般情況下,只能調(diào)試通過(guò) Xcode 安裝的APP,無(wú)法調(diào)試其它APP。
給debugserver賦予權(quán)限
默認(rèn)情況下 /Developer/usr/bin/debugserver 缺少一定的權(quán)限,只能調(diào)試通過(guò)Xcode安裝的App,如果希望調(diào)試其它App,需要對(duì) debugserver 重新簽名,簽上可以調(diào)試其它App的權(quán)限。
需要的兩個(gè)權(quán)限為:get-task-allow 和 task_for_pid-allow
iPhone上的 /Developer 目錄是只讀的,無(wú)法直接對(duì) /Developer/usr/bin/debugserver 文件簽名,需要先把 debugserver 復(fù)制到Mac。
通過(guò) ldid 命令導(dǎo)出文件以前的簽名權(quán)限:
$ ldid -e debugserver > debugserver.entitlements
debugserver.entitlements 這個(gè)文件其實(shí)是個(gè) plist 文件,在這個(gè)文件中加上上面提到的兩個(gè)權(quán)限后,再通過(guò) ldid 命令對(duì)文件重新簽名。
$ ldid -Sdebugserver.entitlements debugserver
然后將已經(jīng)簽好權(quán)限的 debugserver 放到 /usr/bin 目錄,便于找到 debugserver 指令。
debugserver附加到某個(gè)APP進(jìn)程
$ debugserver *:端口號(hào) -a 進(jìn)程
*:端口號(hào):使用iPhone的某個(gè)端口啟動(dòng)debugserver服務(wù)(不是保留端口)
-a進(jìn)程:輸入APP的進(jìn)程信息(進(jìn)程ID或者進(jìn)程名稱)
Mac遠(yuǎn)程連接iPhone上的debugserver服務(wù)
啟動(dòng)LLDB:
// 在終端輸入 $ lldb
連接debugserver服務(wù)
(lldb) process connect connect://手機(jī)IP地址:debugserver服務(wù)端口號(hào)
使用LLDB的c命令讓程序先繼續(xù)運(yùn)行
(lldb) c
到此,就可以遠(yuǎn)程調(diào)試別人的App了。
常用的LLDB指令
給ViewController的test方法設(shè)置斷點(diǎn)
breakpoint set -n "-[ViewController test]"
查看指令用戶使用 help 指令: help breakpoint 等。
打印線程的堆棧信息: thread backtrace
很多命令不在這里贅述,請(qǐng)參考:http://lldb.llvm.org/lldb-gdb.html
ASLR
獲取 ASLR 的偏移量:
image list -o -f
打印結(jié)果的第二列前面的地址就是我們需要的 ASLR 的偏移量offset。
假如我們想給某個(gè)類中的test方法添加斷點(diǎn),那么通過(guò) Hooper 工具找到該方法的第一個(gè)內(nèi)存地址,假如為0x010101,然后地址加上我們得到的 ASLR 的偏移量就是該方法的實(shí)際地址。然后通過(guò)該地址給方法下斷點(diǎn)。
breakpoint set -o 0x010101+offset
以上就是iOS中怎么實(shí)現(xiàn)動(dòng)態(tài)調(diào)試,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。