文章目录
一、什么是动态调试
- 将程序运行起来,通过下断点、打印等方式,查看参数、返回值、函数调用流程等
二、Xcode的动态调试原理
-
关于GCC、LLVM、 GDB、LLDB
-
debugserver
一开始存放在 Mac 的 Xcode 里面/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
文件签
名,需要先把debugserver
复制到Mac - 通过Idid命令导出文件以前的签名权限
ldid -e debugserver > debugserver.entitlements
- 给
debugserver.entitlements
文件加上get-task-allow
和task_for_pid-allow
权限
- 通过Idid命令重新签名
ldid -Sdebugserver.entitlements debugserver
- 将已经签好权限的
debugserver
放到/usr/bin
目录,便于找到debugserver指令 - 关于权限的签名,也可以使用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的可执行文件路径