Reveal调试工具加载方法

Integrating Reveal without modifying your Xcode project

reveal: 檢視 iOS app 的 view 結構。
给出了如何不用修改Xcode工程就可以加载使用Reveal的方法。
在当前用户目录新建一个文件.lldbinit,位于~/.lldbinit,LLDB每次启动的时候都会加载这个文件。
在.lldbinit中输入如下内容:

1
2
3
4
5
6
7
command alias reveal_load_sim expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void *)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2) : ((void*)0) 

command alias reveal_load_dev expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void*)dlopen((char*)[(NSString*)[(NSBundle*)[NSBundle mainBundle] pathForResource:@"libReveal" ofType:@"dylib"] cStringUsingEncoding:0x4], 0x2) : ((void*)0)

command alias reveal_start expr (void)[(NSNotificationCenter*)[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil];

command alias reveal_stop expr (void)[(NSNotificationCenter*)[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStop" object:nil];

上述文件创建了4个命令:

1
reveal_load_sim,reveal_load_dev, reveal_start reveal_stop

####手动加载调试库
在设备起来之后,你就可以断下应用,在LLDB提示框中输入上述的命令了。

请注意:只有在iOS应用发出了UIApplicationDidFinishLaunchingNotification通知之后,比如应用的delegate已经处理过application::didFinishLaunchingWithOptions:之后才能调用上面的revealload*命令,然后再调用reveal_start

reveal_load_sim 这个只在iOS模拟器上有效。它从Reveal的应用程序bundle中找到并加载libReveal.dylib(请确保你把Reveal安装到了系统的 Application 文件夹,如果你换地方了,你修改上述的文件)。

reveal_load_dev 这个命令在iOS设备和模拟器上都有效。不过,它需要你在Build Phase中的的Copy Bundle Resources中加上libReveal.dylib,请确保没有放到Link Binary With Libraries这个地方。

reveal_start 这个命令发出一个通知启动Reveal Server。

reveal_stop 这个命令发出一个通知停止Reveal Server。
请注意:只有在iOS应用发出了UIApplicationDidFinishLaunchingNotification通知之后,比如应用的delegate已经处理过application::didFinishLaunchingWithOptions:之后才能调用上面的reveal_load_*命令,然后再调用reveal_start
在设备起来之后,你就可以断下应用,在LLDB提示框中输入上述的命令了。

上述的过程还需要手动输入,下面介绍如何设置条件断点,使得Reveal在启动之后自动加载。
在你的应用的application:didFinishLaunchingWithOptions中的代码出加一个断点,然后右键,选择编辑断点。
输入如下图一样的命令:

重新运行下应用,如果控制台输出了如下信息:

Reveal server started.

说明Reveal已经自动成功加载。
真机补充:
真机调试下需要额外增加如下配置

要用Reveal连接真机调试,我们需要先把Reveal的动态链接库上传到真机上。由于iOS设备有沙盒存在,所以我们只能将Reveal的动态链接库添加到工程中。

点击Reveal菜单栏的”Help”->”Show Reveal Library in Finder”选项(如下图所示),可以在Finder中显示出Reveal的动态链接库:libReveal.dylib

在 Copy Bundle Resources 配置区域中 ,加入libReveal.dylib

在Link Binary With Libraries配置项中:
如果已有libReveal.dylib,请将其移除——不应在编译时连接dylib文件。
如果下列系统框架与库文件还不存在,请将他们加入:

1
2
3
CFNetwork.framework
QuartzCore.framework
CoreGraphics.framework

  • Xcode一般默认会在工程中包含此框架文件。

2.进入target的Build Phases标签页,选择Editor → Add Build Phase → Add Run Script菜单。在Run Script阶段中加入以下内容:

1
set -e if [ -n "${CODE_SIGN_IDENTITY}" ]; then codesign -fs "${CODE_SIGN_IDENTITY}" "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/libReveal.dylib" fi

之后用Reveal连接真机的方式和连接模拟器的方式类似,我们只需要把上一节提到的断点Action的内容从reveal_load_sim改成reveal_load_dev即可。