将程序运行起来,通过打断点,打印等方式,查看参数、返回值、函数调用等流程等。
一、xcode的动态调试原理
![](https://img.haomeiwen.com/i6005859/a3737a0e61aaf070.png)
首先,lldb传送指令给debugserver,debugserver接收到指令后将指令在app中执行,app再将反馈信息交给debugserver,debugserver再将反馈信息传送lldb。
关于GCC、LLVM、GDB、LLDB
关于debugserver
- debugserver一开始存放在Mac的Xcode里面
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/De viceSupport/9.1/DeveloperDiskImage.dmg/usr/bin/debugserver
- 当Xcode识别到手机设备时,Xcode会自动将debugserver安装到iphone上
/Developer/usr/bin/debugserver
- Xcode调试具有局限性,一般只能调试通过Xcode安装的APP
二、动态调试任意 app
![](https://img.haomeiwen.com/i6005859/340ce34550bb0f85.png)
debugserver的权限问题
- 默认情况下,通过xcode安装的/Developer/usr/bin/debugserver缺少一定的权限,只能调试通过xcode安装的APP,无法调试其他APP(比如来自App Store的APP)
- 如果希望调试其他APP,需要对debugserver重新签名,签上2个调试相关的权限
get-task-allow
task_for_pid-allow
如何给debugserver签上权限
-
iphone上的/Developer目录是只读的,无法直接对/Developer/usr/bin/debugserver文件签名,需要先把debugserver复制到Mac
-
通过ldid命令导出文件以前的签名权限
% ldid -e debugserver > debugserver.entitlements
-
给debugserver.entitlements文件加上
get-task-allow
和task_for_pid-allow
权限
Snip20200813_14.png
-
通过ldid命令重新签名
ldid -Sdebugserver.entitlements debugserver
-
将已经签好权限的debugserver放到/usr/bin目录,便于找到debugserver指令
-
给debugserver文件赋予可执行权限
~ root# chmod +x /usr/bin/debugserver
让debugserver附加到某个APP进程
debugserver *:端口号 -a 进程
~ root# debugserver *:10011 -a YueLiao
- 端口号:使用iphone的某个端口启动debugserver服务(只要不是保留端口号就行)
- -a 进程:输入APP的进程信息(进程ID或者进程名称)
在Mac上启动LLDB,远程连接iphone上的debugserver服务
- 启动lldb
lingli@bogon ~ % lldb
(lldb)
-
连接debugserver服务
(lldb) process connect connect://手机IP地址:debugserver服务端口号
(lldb) process connect connect://192.168.1.26:10011
- 端口映射
将iphone的10011端口映射到Mac的10011端口,与Mac的10011端口进行连接
% python ~/Documents/iOS/usbmuxd/tcprelay.py -t 22:10010 10011:10011 ~ root# debugserver *:10011 -a YueLiao lingli@bogon ~ % lldb (lldb) process connect connect://localhost:10011
-
使用LLDB的c命令让程序先继续运行
c
(continue
)
(lldb) c
Process 7541 resuming
网友评论