- 原文地址:Xcode and LLDB Advanced Debugging Tutorial: Part 1
- 原文做者:Fady Derias
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:kirinzer
- 校对者:iWeslie
在 2018 年的 WWDC 期间,Apple 最优秀的一些调试工程师们开展了一场很是吸引人的会议使用Xcode和LLDB进行高级调试。他们向咱们展现了一些使人印象深入的技巧, 关于每当发生开发人员遇到错误并所有修复它们时,如何利用 Xcode 的断点和低级调试器(LLDB)来优化调试过程。前端
在这个 3 部分的教程中,我将向你介绍 WWDC 会议中已经完成的大部份内容。我建立了一个演示项目专门用于阐述如何配合 LLDB 使用不一样类型的断点来修复项目/应用程序中的错误。android
我写了一个常见的任务项目,大多数 iOS 开发人员确定在某些时候已经处理过。在继续阅读本文以前,须要首先了解它的功能或规则。如下是演示项目的所有内容:ios
若是你比较熟悉 Objective-C,能够在下载这个项目 这里。 更熟悉 Swift,从这里下载 这里。 用 Xcode 打开并运行! 😉git
如今你的项目准备就绪了,也许你已经注意到了下面的错误:github
指导原则:在本文剩下的部分,你没必要中止编译器或者从新运行应用,你能够在运行时修复这些错误。express
让咱们来解决第一个错误。后端
- 下拉刷新没有加载新的文章。
这里有复现这个错误的步骤:数组
✦ 运行应用程序 → 前十个文章被加载。xcode
✦ 向下滚动加载更多文章。bash
✦ 滚动到表视图顶部,而后下拉刷新。
✦ 新文章 没有 从新加载,旧文章仍让存在而且文章计数没有重置。
修复此错误的常规方法是调查分配给表视图控制器的专用 UIRefreshControl 的选择器方法内部发生了什么。前往 **PostsTableViewController**
找到有 pragma mark Refresh control support
的部分。咱们能从setupRefreshControl
方法推断出决定刷新的是 reloadNewPosts
方法。让咱们给这个方法的第一行加一个断点,看看这里到底发生了什么。如今滚动到表视图的顶部,下拉刷新。
一旦你释放了下拉刷新控件,调试器就会在你设置断点的地方暂停。如今,为了探究背后发生了什么,点击调试器的跨过按钮。
如今咱们就很清楚的知道发生了什么!
由于 if 条件没有知足(例如isPullDownToRefreshEnabled
布尔值类型的属性被设置为 NO
)所以,相应的用于加载文章的代码就没有被执行。
修复这个错误的常规作法是中止编译器,设置 isPullDownToRefreshEnabled
属性为 YES
/true
。可是在真正的修改代码和中止编译器以前,就能够对这些假设作出验证会更方便。这里有表达式语句的断点调试器的命令动做,很是方便。
双击设置的断点,或右键单击,编辑断点并点击“添加动做”按钮。选择“调试器命令”动做。
如今咱们要作的是设置 isPullDownToRefreshEnabled
属性未 YES
/true
。添加以下的调试器命令。
Objective-C
expression self.isPullDownToRefreshEnabled = YES
复制代码
Swift
expression self.isPullDownToRefreshEnabled = true
复制代码
接下来你要作的是检查“评估动做后自动继续”框。这会使得调试器不会在每次触发它的断点时暂停,并在评估你刚才添加的表达式后自动继续。
如今滑动到顶部,下拉刷新。
瞧 新的文章被取回来了,而且替换了旧的,所以文章的技术也获得了更新。
既然你已经解决了第一个错误,拿起你的除虫武器开始处理第二个吧。
- 当用户的 HTTP 请求失败的时候,没有收到任何提示(例如警报控制器)。
这里有复现这个错误的步骤:
✦ 关闭手机或模拟器的网络链接。
✦ 滑动到表视图的顶部,下拉刷新。
✦ 因为网络错误,没有加载到新文章。
✦ 网络链接错误的警报控制器没有展现给用户。
前往 PostsTableViewController 找到 pragma mark Networking
的部分。它只有一个方法 loadPosts
。它利用网络管理器的单例去执行一个 GET HTTP 请求,它会返回一个包含文章对象的数组,经过一个“成功”完成的回调或者一个 NSError
的实例,经过一个“失败”完成的回调。
咱们想要作的是在失败完成处理回调中添加一些代码以展现一个网络错误警报控制器。 若是你找到到带有 pragma mark “Support” 的部分,你将会发现已经有一个已实现的方法 presentNetworkFailureAlertController 处理了所需警报控制器的显示。咱们须要作的就是在 loadPosts
失败完成回调中调用该方法。
常规的作法是中止编译器,添加所需的代码,而后就好了。让咱们超脱出来!
在这一行代码下下,添加一个断点
Objective-C
[self updateUIForNetworkCallEnd];
复制代码
Swift
self.updateUIForNetworkCallEnd()
复制代码
双击设置的断点,点击“添加动做”按钮。选择调试器命令动做。添加下面的调试器命令。
Objective-C
expression [self presentNetworkFailureAlertController]
复制代码
Swift
expression self.presentNetworkFailureAlertController()
复制代码
勾选“评估动做后自动继续”。
停用网络链接后,滚动到表视图顶部并下拉刷新,或者你能够向下滚动到表视图底部尝试加载更多。你会获得这个 🎉🎉
你刚才作的是**“注入”**一行代码,经过一个在专用断点内实现为调试器命令动做的表达式语句。
让我简单归纳一下咱们用断点调试器命令动做表达式语句作的事情:
这两项任务都是在运行时实现的,咱们不须要真的中止编译器,修改内容而后从新运行应用程序。
查看 第二部分 本教程中修复了额外的错误,并学习一种特殊类型的断点,观察点。
若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。