[译] Xcode 和 LLDB 高级调试教程:第 2 部分

在三部分教程的第一部分,咱们介绍了如何利用 Xcode 断点操做现有的属性值,以及使用表达式语句注入新代码。前端

我特意开发了一个带有几个错误的演示项目,详细说明了如何使用不一样类型的断点配合 LLDB 来修复项目/应用程序中的错误。android

在继续阅读本文以前,最好先看过本教程的 第一部分ios

让我提醒一下你,本教程的重要规则是: 第一次运行应用程序后,你没必要中止编译器或从新运行应用程序,你会在运行时修复这些错误。git

观察点 👀

让咱们向下一个敌人进军。github

  1. 用户能够加载文章 超过 7 次。

这里有复现这个错误的步骤:express

✦ 打开手机或模拟器的网络链接。后端

✦ 滚动到表视图的底部,加载更多数据。xcode

✦ 滚动加载更多文章的次数超过 7 次。(记住,对于当前的应用程序,用户只能加载文章 7 次)bash

考虑这个错误的一个方法是弄清 pageNumber 这个整形属性自从它被传入到网络管理器,去取回指定页码的新文章对象后是怎样被改变的。你将会花费一些时间和精力在你还不清楚的代码库里,而且弄清这个错误发生在哪里。markdown

不要担忧!如今让咱们作一些神奇的事 🎩

在这个教程的第一部分,你了解到 GET HTTP 请求发生在用 pragma mark Networking 标记的部分。那里只有一个方法 loadPosts。在这个方法的第一行放置一个断点,而后下拉刷新,加载新的文章对象。这个动做会触发你刚才设置的断点。

Objective-C

Swift

在底部的调试器窗口,点击“展现变量视图按钮”。接着就会滑出一个包含了 PostsTableViewController 全部属性的视图。

找到 pageNumber 属性,右键单击,选择 “Watch _pageNumber” / “Watch pageNumber”。

Objective-C

Swift

这会为 pageNumber 属性建立一个叫作“观察点”的断点。观察点是一种断点,当下一次观察的属性有变化的时候它会暂停调试器。

Objective-C

Swift

继续执行程序。调试器将会暂停,你将会看到一些相似下图的东西:

Objective-C

  1. pageNumber 属性旧值和新值的日志。

  2. 致使 pageNumber 属性发生变化的方法调用栈。

  3. 致使pageNumber 属性实际发生改变的当前点。这是属性的 setter 方法。

若是你回到方法调用栈的第一个点,它将会引导你找到如下的代码:

Swift

  1. 调试器控制台通知你,所设置的观察点被触发。

  2. 致使 pageNumber 属性发生变化的方法调用栈。

  3. 致使 pageNumber 属性实际发生改变的当前点。这是一个叫 updateForNetworkCallEnd 的方法。

很显然每当 HTTP GET 请求成功时,只要 state 枚举属性处于 active 状态,pageNumber 属性就会加 1。state 枚举属性能够是 “active” 或者 “inactive”。“active” 状态是指,用户能够继续加载更多文章(就是说没有达到上限数字)。“inactive” 状态则与之相反。结论是,咱们须要在 updateForNetworkCallEnd 内部实现一些逻辑,能够检查 pageNumber 属性,并设置相应的 state 枚举属性。

正如你以前所学到的,最好的方式是在不中止编译器的状况下,先测试一下假设,而后再去实际的修改代码。

你猜对了 😉

重要的是,在 pragma mark Support 下面已经有了一个实现好的方法,能够设置 state 枚举属性。这个方法是 setToInactiveState

在条件语句上一行添加一个断点。接着添加一个调试器动做,而后填写以下的调试器命令。

Objective-C

expression if (self.pageNumber >= 7) {[self setToInactiveState]}
复制代码

Swift

expression if (self.pageNumber >= 7) {setToInactiveState()}
复制代码

作完这些以后,你须要停用以前设置观察点的断点,同时也停用了观察点。

Objective-C

Objective-C

Swift

Swift

如今回到表视图顶部,下拉刷新,接着向下滚动。

不要高兴的太早,咱们还有一个大问题要解决 😄⚔️

接下来去哪里?

查看 第三部分 教程修复了最后的错误,并学习一种新的断点类型,符号断点。

若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索