LLDB是Xcode自帶的除錯工具,既可以在本地除錯Mac程式,也可以在遠端除錯iPhone程式。當使用Xcode除錯遠端裝置時(iPhone),Xcode會講debugserver檔案複製到裝置中(路徑:/Developer/usr/bin/,可以檢視md5值確定是同一個),以便在裝置上啟動一個服務,等待Xcode進行遠端除錯。但是debugserver預設只能除錯自己開發的APP,除錯AppStore下載的app時,會報錯
error: failed to attach process 8487: unable to start the exception thread Exiting.
debugserver
debugserver執行在iOS上,顧名思義,它作為服務端,實際執行LLDB(作為客戶端)傳過來的命令,再把執行結果反饋給LLDB,顯示給使用者,即所謂的“遠端除錯”。
為了除錯其他app,我們需要對debugserver檔案進行操作。
-
賦予debugserver檔案task_for_pid許可權。
- 複製debugserver檔案,可以使用scp命令或者直接使用ifunbox等工具。
$ scp -P 12345 root@localhost:/Developer/usr/bin/debugserver ~/Desktop 複製程式碼
-
簽名許可權
簽名許可權有兩種修改方式:-
使用codesign進行簽名 新建許可權檔案
entitlements.plist
,寫入以下內容:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.springboard.debugapplications</key> <true/> <key>run-unsigned-code</key> <true/> <key>get-task-allow</key> <true/> <key>task_for_pid-allow</key> <true/> </dict> </plist> 複製程式碼
使用codesign進行簽名,命令如下:
$ codesign -s - --entitlements entitlements.plist -f debugserver 複製程式碼
-
使用ldid進行簽名
匯出debugserver的entitlements檔案$ ldid -e debugserver > debugserver.entitlements 複製程式碼
增加以下內容
<key>get-task-allow</key> <true/> <key>task_for_pid-allow</key> <true/> 複製程式碼
使用ldid進行重簽名
$ ldid -Sdebugserver.entitlements debugserver 複製程式碼
-
-
將debugserver複製回手機,複製到手機的
/usr/bin
目錄下。
$ scp -P 12345 ~/Desktop/debugserver root@localhost:/usr/bin/ 複製程式碼
-
進行除錯
與使用openSSH類似,建議做埠轉發後,使用usb進行除錯,速度更快。將本機的1234埠轉發到裝置的1234埠。- 找到目標程式
$ ps -A
或者$ ps aux
- 輸入
$ debugserver *:1234 -a 應用名稱/PID
,命令執行後,進入連結等待狀態,被除錯的程式會卡住。 - Mac終端輸入
$ lldb
進入lldb除錯狀態 - 通過
$ process connect connect://localhost:1234
命令進行連線,連線完成後,目標程式處於暫停狀態,輸入$ c
跳過。 - 在執行過程中,使用
Control + C
暫停程式,進行除錯。
- 找到目標程式