16_动态调试

将程序运行起来,通过打断点,打印等方式,查看参数、返回值、函数调用等流程等。

一、xcode的动态调试原理

Snip20200813_11.png

首先,lldb传送指令给debugserver,debugserver接收到指令后将指令在app中执行,app再将反馈信息交给debugserver,debugserver再将反馈信息传送lldb。

关于GCC、LLVM、GDB、LLDB
  • xcode的编译器发展历程:GCC -> LLVM
  • xcode的调试器发展历程: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

Snip20200813_12.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-allowtask_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

你可能感兴趣的:(16_动态调试)