PonyDebugger 0.5

PonyDebugger 0.5

测试已测试
语言语言 Obj-CObjective C
许可 NOASSERTION
发布最后发布2019年9月

Michael TholeWen-Hao LueDan FedermanBrian PartridgeDimitris KoutsogiorgasJustin Martin维护。



  • Square

PonyDebugger Logo

PonyDebugger

CI Status Version License Platform

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 Network Debugging Screenshot

PonyDebugger转发网络流量,并不嗅探网络流量。这意味着通过安全协议(https)发送的流量是可调试的。

目前,iOS客户端自动代理通过NSURLConnectionNSURLSession方法发送的数据。这意味着它将与AFNetworking和其他使用NSURLConnectionNSURLSession进行网络请求的库自动工作。

核心数据浏览器

核心数据浏览功能允许您注册应用程序的 NSManagedObjectContext,并浏览所有关联的实体和托管对象。您可以在 Chrome 开发者工具的资源标签页中的索引数据库部分浏览数据。

PonyDebugger Core Data Browser Screenshot

目前这些存储为只读存储。未来计划在版本更新中实现数据变更。

视图层次结构调试

PonyDebugger 可以在 Chrome 开发者工具的“元素”标签页中显示应用程序的视图层次结构。当您遍历 XML 树时,相应的视图将在应用中被突出显示。您可以直接从“元素”标签页编辑显示的属性(例如,frame、alpha等),并通过向 PonyDebugger 提供一个UIView关键路径数组来更改显示的属性。删除元素面板中的节点将从视图层次结构中删除该节点。最后,当视图中被高亮时,您可以通过使用滑动和捏合手势从应用中移动或调整其大小。

PonyDebugger View Hierarchy Debugging Screenshot

通过点击开发者工具窗口左下角的放大镜可以进入“检查”模式。在此模式下,在 iOS 应用中轻 tapped 视图将选择元素面板中相应的节点。您还可以按住手指并拖动以查看高亮显示的不同视图。当您抬起手指时,高亮显示的视图将在元素面板中被选中。

目前仅实现了元素面板中可行操作的一部分。还有很大的改进空间,但当前的功能仍然很有用。

远程日志

PonyDebugger 允许您通过 PDLogPDLogObjects 函数远程记录文本和对象转储。这样可以减少在 NSLog 中记录的内容量,同时还可以动态地内省对象。

PonyDebugger Remote Login Screenshot

通过属性递归展开内省的对象。这意味着您无需在 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 Installing Subproject

  • 在项目设置中,在构建阶段选项卡中将 PonyDebugger 目标添加为目标依赖项。

PonyDebugger Installing Target Dependencies

  • libPonyDebugger.alibSocketRocket.a 和框架依赖项链接到您的项目。

PonyDebugger Installing Link Libraries and Frameworks

  • PonyDebugger 和 SocketRocket 利用 Objective C 在对象上添加类别的能力,但默认情况下这并不适用于静态库。要启用此功能,请将 -ObjC 标志添加到 "其他链接器标志" 构建设置。

PonyDebugger Installing Other Linker Flags

框架依赖项

除了 libPonyDebugger.alibSocketRocket.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 之前,请仔细阅读我们的贡献指南

一些有用的链接