非越狱环境下能否通过LLDB/Xcode启动iPhone的debugserver?
非越狱环境下手动启动iOS debugserver实现自定义调试方案
非越狱环境完全可以实现你要的效果,所有操作都在苹果开放给自有App开发者的合法权限范围内,不需要越狱、不需要修改系统文件、不需要重签debugserver。
核心原理
Xcode本身没有特殊权限,它和iPhone的调试通信完全走公开的设备配对通道:配对后的Mac可以通过lockdown服务与iPhone通信,挂载开发者磁盘镜像,调用镜像内自带的debugserver进程,这个进程默认就拥有附加同开发者签名App的调试权限,不存在只能被Xcode调用的限制。你之前遇到的端口自动转为ESTABLISHED状态,只是Xcode启动debugserver后默认立即发起连接、没有留出手动连接的窗口而已。
可直接复现的操作步骤
前置准备
- 测试iPhone已开启开发者模式,和Mac完成Xcode配对,待调试的自有App已用你的开发者证书安装到设备上
- 若需要便捷的端口映射能力,可通过brew安装libimobiledevice工具集,用到其中的
iproxy命令;不想装第三方工具的话,纯用Xcode自带的LLDB也能完成全流程
方法1:纯命令行启动debugserver开放自定义监听端口(推荐)
- 先做USB端口转发,把iPhone上的1234端口映射到Mac本地的1234端口,终端执行以下命令后保持窗口不要关闭:
如果你的Mac连了多台iOS设备,可以在命令最后加上目标设备的UDID指定设备。iproxy 1234 1234 - 新开一个终端窗口,执行命令启动iPhone端的debugserver,附加目标App并监听1234端口:
执行成功后你会看到和越狱环境下几乎完全一致的输出,提示debugserver已经启动、进入LISTENING状态等待1234端口的连接。这个状态下Xcode不会自动抢占连接,你可以用任何支持gdb-remote协议的自定义调试客户端连接本地1234端口,发送自定义调试指令、读取进程内存数据。idevicedebug -u [你的设备UDID] start debugserver --port=1234 [你的App Bundle ID]
方法2:纯用LLDB官方流程实现,不依赖第三方工具
如果不想安装额外工具,直接用Xcode自带的LLDB也能完成手动连接:
- 终端输入
lldb进入LLDB交互环境 - 依次执行以下命令选中远程iOS调试平台、指定目标设备:
platform select remote-ios settings set target.sdk-path /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk device list device select [你的目标设备UDID] - 手动触发设备端启动debugserver并监听端口,之后就可以通过
process connect命令建立自定义调试连接,所有调试指令完全由你控制,不会被Xcode的自动流程打断。
常见问题说明
- 你之前提到的
lldb-server是LLVM上游的通用调试服务端,iOS平台苹果定制的对应二进制就是debugserver,命令参数略有差异,不需要纠结命令名的区别。 - 非越狱环境下启动的debugserver权限范围有限,只能附加和调试你自己开发者证书签名安装的App,无法调试系统App或其他开发者发布的App,正好匹配你调试自有App的需求,不会触发任何系统安全限制。
- 你之前提到的Mac端无法直接查看iPhone本地进程PID的问题,在建立debugserver连接后,直接在LLDB中执行
platform process list就能列出设备上所有运行中的进程,拿到对应目标App的PID,不需要额外权限。 - 不需要手动重签debugserver、不需要给debugserver添加额外权限,开发者镜像里自带的debugserver已经包含了调试自有App需要的全部权限配置,直接调用即可。
内容的提问来源于stack exchange,提问作者Vladislav
相关产品推荐
相关产品推荐

