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