iOS 7越狱调试
iOS 7中苹果彻底放弃了对gdb的维护,所以必须用C/S模式来调试程序。
配置调试环境
采用的调试环境为gdb-server(iOS 7)+ lldb(OS X)。
在iOS SDK中带有debugserver,我们要做的就是把debugserver打补丁,然后复制到iOS下运行。 完整的教程参考这个链接。
复制debugserver,使用lipo取出合适的部分,例如运行在armv7设备上:
lipo -thin armv7 debugserver -output dbgserverv7
把以下文件保存为ent.xml,下一步ldid会用到它为文件添加权限位:
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.springboard.debugapplications</key> <true/> <key>get-task-allow</key> <true/> <key>task_for_pid-allow</key> <true/> <key>run-unsigned-code</key> <true/> </dict> </plist>
用ldid进行伪签名,ldid可以用brew安装:
ldid -Sent.xml dbgserverv7
把dbgserverv7用任何办法复制到iOS设备上,准备部分就完成了。
启动调试
基本思路是在iOS下运行dbgserver,然后在OS X下运行lldb,连接至iOS。
在iOS下执行服务器端,在这里监听了端口:
dbgserverv7 0.0.0.0:8888
把调试的文件从iOS复制到OS X下,以便lldb载入。当然,如果调试的自己的程序,有了符号表 就可以省略这个步骤了,lldb会自动找到源码。
在OS X下运行lldb,其实gdb也是可以的。然后在lldb中使用gdb-server命令连接调试服务器:
lldb (lldb) gdb-server 192.168.1.11:8888
如果没有错误信息,连接就成功建立了。
LLDB技巧
初学lldb,可以参考这个文档,记载了gdb命令与lldb命令的对应:
等待进程启动
(lldb) process attach --name XXXX --waitfor
查询符号表
(lldb) image lookup -s NAME_TO_FIND
反汇编函数
(lldb) disassemble -n FUNCTION_NAME
可能还会陆续更新(?)