断点调试的前提,是gdb或者lldb能够attach上被调试的程序。

Xcode自带lldb和gdb(Xcode 5.0去除了gdb),特别是lldb,对于Objective-C的调试很是方便;同时作为官方IDE,Xcode的图形化界面对于断点和堆栈也很是直观。所以若条件许可,利用Xcode的lldb来调试程序最为方便。

get-task-allow

Code signing Entitlements中有一项很重要的key值,就是get-task-allow,作用如下:

get-task-allow, when signed into an application, allows other processes (like the debugger) to attach to your app. Distribution profiles require that this value be turned off, while development profiles require this value to be turned on (otherwise Xcode would never be able to launch and attach to your app).

也就是说,get-task-allow决定了这个app能否被Xcode调试。一般来说,上架了的程序,这个key值为空,默认为NO。

模拟器

理所当然,既然能build进模拟器,那就说明这个app能够被调试。那么就大胆地启动app,在Xcode菜单里面选择

Debug - Attach to Process - [process name]。

选项中会列出Mac OS上所有的进程,有点多,按顺序找找有了。

而对于模拟器上的系统程序(如Safari),默认也都是可调试的,如下图:

真机

(以下内容涉及app crack)

真机上的app,若不是自己build进去的,基本没有调试的权限。原因在于get-task-allow没有开启。若要开启,步骤如下:

以MobileSafari为例。

  1. 在越狱iOS设备上,利用iOS系统文件管理工具(itools,ifunbox),在Applications/MobileSafari.app目录下,找到MobileSafari这个执行文件,拷贝到Mac上。利用ldid将MobileSafari的code sign导出:

    1
    ldid -e MobileSafari  MobileSafari.xml
  2. 打开MobileSafari.xml细心看看,好多的私有key。不过不必天真,Code signing Entitlements若出现了私有key,是不允许上架的。在MobileSafari.xml添加get-task-allow这个key,并赋值为true,保存退出。

  3. 对MobileSafari进行重签名:

    1
    ldid -SMobileSafari.xml ./MobileSafari
  4. 将MobileSafari重新拷贝回iOS设备,声明下权限:

    1
    chmod 755 ./MobileSafari
  5. 启动Safari,Debug - Attach to Process - [process name]。

  6. 成功Attach上去之后,点击暂停按钮,在控制台执行指令
    1
    po [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"]

打印出App的名称,可以看到Safari,如下图:

测试环境和工具

  • Xcode 5.0
  • 越狱的iPhone,iOS6.1
  • ifunbox

参考

xcode中的get-task-allow有什么用?