文章目录
- 一、什么是动态调试
- 二、Xcode的动态调试原理
- 三、动态调试任意APP
-
- 3.1 debugserver的权限问题
- 3.2 如何给debugserver签上权限
- 3.3 让debugserver附加到某个APP进程
- 3.4 在Mac上启动LLDB,远程连接iPhone上的debugserver服务
- 3.5 通过debugserver 启动 APP
一、什么是动态调试
- 将程序运行起来,通过下断点、打印等方式,查看参数、返回值、函数调用流程等
二、Xcode的动态调试原理
- 关于GCC、LLVM、 GDB、LLDB
- Xcode的编译器发展历程: GCC→LLVM
- Xcode的调试器发展历程: GDB→LLDB
-
一开始存放在 Mac 的 Xcode 里面debugserver
-
/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
文件签
名,需要先把
复制到Macdebugserver
- 通过Idid命令导出文件以前的签名权限
ldid -e debugserver > debugserver.entitlements
- 给
文件加上debugserver.entitlements
和get-task-allow
权限task_for_pid-allow
- 通过Idid命令重新签名
ldid -Sdebugserver.entitlements debugserver
- 将已经签好权限的
放到debugserver
目录,便于找到debugserver指令/usr/bin
- 关于权限的签名,也可以使用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的可执行文件路径