Xcode動態除錯原理
-
關於GCC、LLVM、GDB、LLDB
- GCC -> LLVM: 編譯器
- GDB -> LLDB: 偵錯程式
-
debugserver 一開始存放在 Mac 的 Xcode 裡面
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/13.1/DeveloperDiskImage.dmg/usr/bin/debugserver
複製程式碼
- 當Xcode識別到手機裝置時,Xcode 會自動將 debugserver 安裝到 iPhone 上
// 越獄之後通過這個路徑就能看到
/Developer/usr/bin/debugserver
複製程式碼
- Xcode除錯的侷限性
- 一般情況下,只能除錯通過 Xcode 安裝的 App
動態除錯任意 App
原理:把本來通過Xcode中內建的 llbd,換成終端中的 lldb。 預設情況下,debugserver 沒有許可權去除錯非 Xcode 安裝的 App, 所以需要重新簽名,簽上2個除錯相關的許可權
get-task-allow
task_for_pid-allow
複製程式碼
- 將 debugserver 拷貝到電腦上進行重簽名
ldid -e debugserver > debugserver.entitlements
複製程式碼
- 為 debugserver.entitlements 增加許可權
ldid -Sdebugserver.entitlements debugserver
複製程式碼
3.把重新簽名的 debugserver 放到手機的 /usr/bin 目錄中,然後修改一下許可權
chmod +x debugserver
複製程式碼
4.debugserver 連線 app
debugserver *:10011 -a WeChat
複製程式碼
5.把本地的埠和遠端的埠對映起來,然後利用終端連線 debugserver
lldb
(lldb)process connect connect://localhost:10011
複製程式碼
6.Failed to get connection from a remote gdb process,說明這個埠被用了
killall -9 debugserver
複製程式碼