logify、Xcode运行原理
1. 动态调试Xcode
- 什么叫动态调试?
- 将程序运行起来,通过下面断点,打印等方式,查看参数、返回值、函数调用流程等
1.1 Xcode的动态调用原理
-
关于GCC、LLVM、GDB、LLDB
-
debugserver一开始存放在Mac的Xcode里面/Applications/Xcode12.3.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/9.1/DeveloperDiskImage.dmg/usr/bin/debugserver

-
当Xcode识别手机设备时,Xcode会自动将
debugserver安装到iPhone上,如果是从来没有真机测试的iPhone上是没有debugserver的:
-
Xcode调试的局限性:一般情况下,只能通过Xcode安装的APP
-
Xcode调试APP的原理图:

-
当你真机运行的时候,Xcode会在手机上安装
debugserver的,debugserver监听着LLDB发送的一些指令,首先LLDB将这些指令传送给debugserver, 然后debugserver接收到这个指令时,在执行到app上,app执行指令后把结果反馈给debugserver,然后再由debugserver把结果返回给LLDB,在由LLDB把信息打印在Xcode上,这也是Xcode可以动态调试app的原因:

-
p: 直接地址 -
po:打印对象 -
LLDB 是通过数据线来传递数据的
1.2 动态调试任何APP
1.2.1 原理图和条件
动态调试任何App示意图:

- 首先手机上必须要有
debugserver,其次我们可以通过终端 输入lldb进入lldb的调试环境:
1.2.2 debugserver的权限问题
- 默认情况下,
/Developer/usr/bin/debugserver缺少一定的权限,只能通过Xcode安装的APP,无法连接其他APP(比如来自App Store的App) - 如果希望调试其他APP,需要对
debuserver重新签名,签上两个调试相关的权限get-task-allow Boolean 类型 值为YEStask_for_pid-allow Boolean 类型 值为YES
- 如何给
debugserver签上权限- iPhone上的
/Developer目录是只读,无法直接对/Developer/usr/bin/debugserver文件直接签名,需要先把debugserver赋值到Mac上 - 通过
ldid导出以前文件以前的签名权限:ldid -e debugserver > debugserver.entitlements - 给
debugserver.entitlements文件加上get-task-allow、task_for_pid-allow权限:
- 在通过
ldid命令重新签名:did -Sdebugs
- iPhone上的

本文详细介绍了Xcode的动态调试原理及其应用,包括Xcode如何通过debugserver远程调试应用程序、LLDB命令的具体使用方法等内容。
最低0.47元/天 解锁文章
1015





