PonyDebugger
PonyDebugger 是一款远程调试工具集。它是一个客户端库和网关服务器的组合,使用您浏览器中的 Chrome 开发者工具来调试您的应用程序的网络流量和管理对象上下文。
要使用 PonyDebugger,您必须在应用程序中实现客户端并将其连接到网关服务器。目前有 iOS 客户端和网关服务器。
PonyDebugger 使用 Apache 许可证,版本 2.0(http://www.apache.org/licenses/LICENSE-2.0.html)。
变更
v0.4.0 - 2014-08-15
- 支持
NSURLSession
网络调试请求。 (@viteinfinite) - 添加了新的测试应用程序,删除了 AFNetworking 依赖。 (@viteinfinite)
- 使用 Apple 内置的实现删除了自定义 base64 实现。 (@kyleve)
- 添加 PodSpec 以直接拉取 git 仓库。 (@wlue)
v0.3.1 - 2014-01-02
- 仅修复调试模式下构建活动架构的问题。 (@kyleve)
- 修复了复杂键路径引起的视图层次调试问题。 (@ryanolsonk)
- 修复了在 swizzled exchangeSubviewAtIndex:withSubviewAtIndex: 中的崩溃问题 (@ryanolsonk)
- 修复了拥有类似 NSURLConnectionDelegate 的库时的崩溃问题 (@peterwilli)
v0.3.0 - 2013-05-01
- 远程日志和检查 (@wlue)
- 在 Network Debugger 中请求和响应的格式化打印 (@davidapgar)
- 小错误修复和改进。 (@jerryhjones, @conradev, @ryanolsonk)
v0.2.1-beta1 - 2013-01-12
- 支持Bonjour (@jeanregisser)
- 内存泄漏修复 (@rwickliffe)
特性
网络流量调试
PonyDebugger通过ponyd,PonyDebugger的代理服务器发送您的应用程序的网络流量。您使用检查器的网络工具来调试网络流量,就像您在Google Chrome中调试网站上的网络流量一样。
PonyDebugger转发网络流量,并不嗅探网络流量。这意味着通过安全协议(https)发送的流量是可调试的。
目前,iOS客户端自动代理通过NSURLConnection
和NSURLSession
方法发送的数据。这意味着它将与AFNetworking和其他使用NSURLConnection
或NSURLSession
进行网络请求的库自动工作。
核心数据浏览器
核心数据浏览功能允许您注册应用程序的 NSManagedObjectContext
,并浏览所有关联的实体和托管对象。您可以在 Chrome 开发者工具的资源标签页中的索引数据库部分浏览数据。
目前这些存储为只读存储。未来计划在版本更新中实现数据变更。
视图层次结构调试
PonyDebugger 可以在 Chrome 开发者工具的“元素”标签页中显示应用程序的视图层次结构。当您遍历 XML 树时,相应的视图将在应用中被突出显示。您可以直接从“元素”标签页编辑显示的属性(例如,frame、alpha等),并通过向 PonyDebugger 提供一个UIView关键路径数组来更改显示的属性。删除元素面板中的节点将从视图层次结构中删除该节点。最后,当视图中被高亮时,您可以通过使用滑动和捏合手势从应用中移动或调整其大小。
通过点击开发者工具窗口左下角的放大镜可以进入“检查”模式。在此模式下,在 iOS 应用中轻 tapped 视图将选择元素面板中相应的节点。您还可以按住手指并拖动以查看高亮显示的不同视图。当您抬起手指时,高亮显示的视图将在元素面板中被选中。
目前仅实现了元素面板中可行操作的一部分。还有很大的改进空间,但当前的功能仍然很有用。
远程日志
PonyDebugger 允许您通过 PDLog
和 PDLogObjects
函数远程记录文本和对象转储。这样可以减少在 NSLog
中记录的内容量,同时还可以动态地内省对象。
通过属性递归展开内省的对象。这意味着您无需在 GDB 或 LLDB 中设置断点并记录来内省一个对象。
快速入门
前提条件:请从“下载”首选项选项卡安装 Xcode 的命令行工具。
curl -s https://cloud.github.com/downloads/square/PonyDebugger/bootstrap-ponyd.py | \
python - --ponyd-symlink=/usr/local/bin/ponyd ~/Library/PonyDebugger
此操作将在 ~/Library/PonyDebugger/bin/ponyd
下安装 ponyd
脚本,并尝试将 /usr/local/bin/ponyd
符号链接到它。它还将下载最新的 Chrome 开发者工具源代码。
然后启动 PonyDebugger 网关服务器
ponyd serve --listen-interface=127.0.0.1
在浏览器中,导航到 http://localhost:9000
。你应该看到 PonyGateway 大厅。现在你需要将客户端集成到你的应用程序中。
有关更详细的说明,请查看网关服务器的 README_ponyd。
PonyDebugger iOS 客户端
PonyDebugger iOS 客户端允许你调试应用程序的网络请求并跟踪托管对象上下文。
技术细节
- 要求 iOS 5.0 或更高版本
- 使用 ARC(自动引用计数)
- 使用 SocketRocket 作为 WebSocket 客户端
安装
CocoaPods
CocoaPods 自动化 Objective-C 中的第三方依赖项。
安装 ruby gem。
$ sudo gem install cocoapods
$ pod setup
根据 Ruby 安装,你可能无需以 sudo 用户运行来安装 cocoapods gem。
创建 Podfile。你必须运行在 iOS 5 或更高版本。
platform :ios, '5.0'
pod 'PonyDebugger', '~> 0.4.3'
如果你希望使用 PonyDebugger 的最新版本,直接指向 GitHub 仓库。
pod 'PonyDebugger', :git => 'https://github.com/square/PonyDebugger.git'
安装依赖项。
$ pod install
使用 CocoaPods 时,构建项目时必须打开 .xcworkspace
文件而不是项目文件。
手动安装
- 将存储库的 tarball 或 zipball 解压到您的项目目录中。如果您喜欢,您也可以将其作为子模块添加。iOS 客户端使用SocketRocket作为依赖项,并将其作为子模块包含。
cd /path/to/YourApplication
mkdir Frameworks
git submodule add git://github.com/square/PonyDebugger.git Frameworks/PonyDebugger
git submodule update --init --recursive
- 将
PonyDebugger/PonyDebugger.xcodeproj
添加为子项目。
- 在项目设置中,在构建阶段选项卡中将 PonyDebugger 目标添加为目标依赖项。
- 将
libPonyDebugger.a
、libSocketRocket.a
和框架依赖项链接到您的项目。
- PonyDebugger 和 SocketRocket 利用 Objective C 在对象上添加类别的能力,但默认情况下这并不适用于静态库。要启用此功能,请将
-ObjC
标志添加到 "其他链接器标志" 构建设置。
框架依赖项
除了 libPonyDebugger.a
和 libSocketRocket.a
之外,您的 .app 必须链接以下框架或 dylib。
- libicucore.dylib
- CFNetwork.framework
- CoreData.framework
- Security.framework
- Foundation.framework
使用方法
PonyDebugger 的主要入口点存在于 PDDebugger
单例中。
PDDebugger *debugger = [PDDebugger defaultInstance];
自动连接到您 LAN 上的 PonyGateway(通过 Bonjour)
[debugger autoConnect];
或打开连接到特定主机,例如 ws://localhost:9000/device
[debugger connectToURL:[NSURL URLWithString:@"ws://localhost:9000/device"]];
手动关闭连接
[debugger disconnect];
网络流量调试
要启用网络调试
[debugger enableNetworkTrafficDebugging];
PonyDebugger 通过向 NSURLConnectionDelegate
类中注入逻辑来检查网络数据。如果您想让您自动找到这些类
[debugger forwardAllNetworkTraffic];
这将重新交换私有 API 的方法,因此您应确保这仅在调试构建中调用。要手动指定代理类
[debugger forwardNetworkTrafficFromDelegateClass:[MyClass class]];
这些方法应在连接打开之前调用。
核心数据浏览器
PonyDebugger 还允许你浏览应用程序的托管对象。首先,启用 Core Data 调试
[debugger enableCoreDataDebugging];
注册托管对象上下文
[debugger addManagedObjectContext:self.managedObjectContext withName:@"My MOC"];
视图层次结构调试
启用视图层次结构调试
[debugger enableViewHierarchyDebugging];
PonyDebugger 将向 UIView
添加/删除方法,以便监视视图层次结构的变化。
您还可以通过传递一个包含 UIView
键路径字符串的数组来设置元素面板中想要查看的属性。
[debugger setDisplayedViewAttributeKeyPaths:@[@"frame", @"hidden", @"alpha", @"opaque"]];
PonyDebugger 使用 KVO 来监视层次结构中所有视图的属性变化,因此元素面板中的信息保持最新。
远程记录
启用远程记录
[debugger enableRemoteLogging];
示例用法
PDLog("Hello world!"); // This logs a simple string to the console output.
PDLogObjects(self); // This logs an introspectable version of "self" to the console.
PDLogObjects("My object:", object); // Combination of text and introspectable object.
该存储库包含一个用于演示 PonyDebugger 功能和用法的测试应用程序。
已知问题/改进
-
CoreData.framework
必须链接,即使没有使用 Core Data 浏览功能。 -
iOS 5.1 及以下版本:在某些情况下,
-[NSURLConnectionDataDelegate connection:willSendRequest:redirectResponse:]
不会有调用。PonyDebugger 需要这个调用来知道请求何时被发送,并且会警告你有一个不准确的计时戳的解决方案。要修复计时戳,确保在您的
NSURLRequest
中没有设置Accept-Encoding
HTTP 头(默认情况下,iOS 会将其设置为gzip, deflate
,这通常足够了。AFNetworking 用户:如果您重写了
AFHTTPClient
,请调用[self setDefaultHeader:@"Accept-Encoding" value:nil];
。
贡献
我们对您对 PonyDebugger 的兴趣感到高兴,并且很乐意看到您将用它做到什么程度。在提交 Pull Request 之前,请仔细阅读我们的贡献指南。
一些有用的链接