debugserver + lldb 动态调试

配置debugserver

debugserver运行在的iOS上,顾名思义,它作为服务端,实际执行LLDB(作为客户端)传过来的命令,再把执行结果反馈给LLDB,显示给用户,即所谓的“远程调试”。在默认情况下,iOS设备上并没有安装debugserver,只有在设备连接过一次的Xcode,并在窗口→设备菜单中添加此设备后,debugserver才会被Xcode中安装到iOS版的“/开发人员的/ usr / bin中/”目录下。

将debugserver从手机传到mac

使用iproxy工具,将当前连接设备的22端口(SSH)映射到电脑的2222端口

1
iproxy 2222 22

SSH到usb设备上

1
ssh -p2222 root@127.0.0.1

传输文件

1
scp -P2222 root@127.0.0.1:/Developer/usr/bin/debugserver ~/Desktop

给debugserver瘦身

对照表格找到设备的ARM信息
iPhone对应arm架构
例如iphone为5c,执行

1
lipo -thin armv7s ~/debugserver -output ~/debugserver

给debugserver添加权限

安装ldid

1
brew install ldid

下载ent.xml到MACOS目录,然后运行:

1
ldid -Sent.xml debugserver

注意“-S”选项与“Sent.xml”之间是没有空格的,Sent.xml是设置二进制授权的文件,没有的话可以去网上找找,也可在工程中找entitlements文件获得。

将经过处理的debugserver拷回手机

1
scp -P2222 ~/debugserver root@127.0.0.1:/usr/bin/debugserver

连接进程

通过端口号调试

ssh到ios上,执行

1
ps aux

查看pid

1
debugserver *:1234 -a  prossesname/pid  

文件方式启动,不需端口号

1
debugserver -x frontboard   *:1234   /var/containers/Bundle/Application/1452A4F7-C5B1-4654-9CDC-4D94C3C94F47/MTPotal.app

把本地端口映射到苹果端口

1
iproxy 1234 1234

在Mac系统上用LLDB远程调试

1
process connect connect://localhost:1234

这条命令执行耗时比较长,需要耐心等一会

常用lldb命令

1
2
3
4
5
6
7
8
9
10
11
12
13
#查看地址
image list -o -f
#查看类内地址
po [className _shortMethodDescription]
#设置断点
br s -a 0x452C96
#删除所有断点
br del
#禁用第3个断点(启用en)
br dis 3

-c 用来设置断点条件
-o 来设置单次断点

更多命令查看手册

参考链接

http://iosre.com/t/debugserver-lldb-gdb/65
http://zhz.io/2018/07/05/%E9%82%A3%E4%B8%AALLDB%E4%BD%A0%E7%9C%9F%E7%9A%84%E4%BA%86%E8%A7%A3%E5%90%97/