文章目錄
一、什麼是動態調試
- 將程序運行起來,通過下斷點、打印等方式,查看參數、返回值、函數調用流程等
二、Xcode的動態調試原理
-
關於GCC、LLVM、 GDB、LLDB
-
debugserver
一開始存放在 Mac 的 Xcode 裏面/Applications/Xcode.app/Contents/Developer/Platforms/iPhone0S.platform/De viceSupport/9.1/DeveloperDisklmage.dmg/usr/bin/debugserver
-
當Xcode識別到手機設備時,Xcode會自動將debugserver安裝到iPhone上
/Developer/usr/bin/debugserver
- 注意: 這個文件夾是隻讀屬性
-
Xcode調試的侷限性
- 一般情況下,只能調試通過Xcode安裝的APP
三、動態調試任意APP
3.1 debugserver的權限問題
-
默認情況下,
/Developer/usr/bin/debugserver
缺少一定的權限,只能調試通過Xcode安裝的
APP,無法調試其他APP (比如來自App Store的APP) -
如果希望調試其他APP,需要對debugserver重新簽名,簽上2個調試相關的權限
- get-task-allow
- task_for_pid-allow
3.2 如何給debugserver簽上權限
- iPhone上的
/Developer/
目錄是隻讀的,無法直接對/Developer/usr/bin/debugserver
文件籤
名,需要先把debugserver
複製到Mac - 通過Idid命令導出文件以前的簽名權限
ldid -e debugserver > debugserver.entitlements
- 給
debugserver.entitlements
文件加上get-task-allow
和task_for_pid-allow
權限
- 通過Idid命令重新簽名
ldid -Sdebugserver.entitlements debugserver
- 將已經簽好權限的
debugserver
放到/usr/bin
目錄,便於找到debugserver指令 - 關於權限的簽名,也可以使用codesign
# 查看權限信息
$ codesign -d --entitlements - debugserver
# 簽名權限
$ codesign -f -s - --entitlements debugserver.entitlements debugserver
# 或者簡寫爲
$ codesign -fs- --entitlements debugserver .entitlements debugserver
3.3 讓debugserver附加到某個APP進程
$ debugserver *:端口號 -a 進程
*:端口號
- 使用iPhone的某個端口啓動debugserver服務 (只要不是保留端口號就行)
a進程
- 輸入APP的進程信息(進程ID或者進程名稱)
3.4 在Mac上啓動LLDB,遠程連接iPhone上的debugserver服務
- 啓動LLDB
~ » lldb
(lldb)
- 連接debugsever服務
(lldb) process connect connect://手機IP地址:debugserver服務端口號
# 這裏用的是手機的10011端口映射電腦的10011端口, 這樣就可以直接使用電腦的10011端口了
process connect connect://localhost:10011
- 使用LLDB的c(continue)命令讓程序繼續運行
(lldb) c
- 接下來就可以使用LLDB命令調試App了
3.5 通過debugserver 啓動 APP
$ debugserver -x auto *:端口號 APP的可執行文件路徑