LLDB中的Xcode和高级调试:第1部分

午安,今天,我建议您熟悉一下有关使用LLDB调试iOS应用程序的文章的翻译。

Apple工程师介绍了WWDC 2018演示文稿中最有趣的部分之一,LLDB中的Xcode和高级调试 。 他们给出了一些有用的技巧,这些技巧提示了如何在开发人员发现错误的地方使用Xcode和低级调试器(LLDB)中的断点来优化调试错误的过程。

本文分为三个部分,我们将介绍在WWDC上所说的要点。 我创建了一个演示项目,专门用于更好地了解如何结合LLDB使用各种类型的断点(断点)来捕获和调试应用程序中的错误。

示范项目

我创建了一个模板任务项目,每个iOS开发人员都以某种方式开会。 在深入阅读本文之前,了解其工作原理非常重要。 这是演示项目的主要功能:

  • 打开后,我们会看到一个加载了帖子列表的表格视图控制器。
  • 向下滚动时,表视图控制器将加载新帖子。
  • 总共可以加载7次
  • 您可以通过使用刷新控制器下拉(下拉以刷新)来更新帖子列表。
  • 在顶部的导航栏中,有2个标签(标签),显示已下载了多少帖子(右侧标签)以及用户已上传帖子的次数(左侧标签)。

如果您更喜欢Objective-C,则可以从此处下载演示项目。

如果您更喜欢Swift,那么从这里开始

启动Xcode,开始吧!

修正错误!

因此,您熟悉了该项目,并可能注意到以下错误:

  • 下拉表格时,刷新器不会更新帖子。
  • 由于连接问题,用户没有收到任何有关HTTP请求尚未完成的通知(使用警报控制器)。
  • 您可以加载帖子7次以上。
  • 导航栏中用于计算下载次数的左侧指示器(标签)不起作用。

一个重要规则:在本文结束之前,您不要停止编译器,也不要在首次启动后重新启动应用程序。 您可以在程序执行过程中更正错误。

指导团队的力量

让我们开始讨论第一个错误。

1.当您拉下桌子时,帖子不会更新。

如何重现错误:

  • 启动应用程序,前10个帖子已经加载。
  • 向下滚动以加载更多帖子。
  • 向上滚动到表格的开头,然后向下拖动以刷新。
  • 新帖子不会加载,旧帖子不会消失,并且帖子计数器不会重置。

纠正此类错误的标准方法涉及检查负责表的UIRefreshControl的方法选择器内部发生的情况。 转到实用 标记“刷新控件支持”部分中的PostsTableViewController 。 从setupRefreshControl函数中,我们可以得出结论,负责更新帖子的选择器是reloadNewPosts函数。 让我们在此函数的第一行添加一个断点,然后找出此处到底发生了什么。 现在向上滚动到表格的开头,然后拖动屏幕进行刷新。

图片
目标c

图片
斯威夫特

调试器在您设置的断点处停止。 为了进一步研究,请单击调试器的“跳过块”按钮。

图片
目标c

图片
斯威夫特

现在,我们已经了解了出了什么问题!

如果不满足if条件(即布尔变量isPullDownToRefreshEnabled设置为NO),结果将跳过更新帖子的代码。

标准方法涉及停止编译器,然后您需要将isPullDownToRefreshEnabled设置为YES / true,这样就可以解决问题。 但是,在对代码进行任何更改之前先测试我们的假设,而不必停止编译器会更加方便。 这是调试器指令命令非常有用的地方。

双击已安装的断点或右键单击“编辑断点”,然后单击“添加操作”按钮。 还要选择操作类型“ Debugger Command”。

图片

现在我们需要将isPullDownToRefreshEnabled属性设置为YES / true。 将以下命令添加到调试器。

目标c

expression self.isPullDownToRefreshEnabled = YES 


图片

斯威夫特

 expression self.isPullDownToRefreshEnabled = true 

图片

接下来,选中“评估动作后自动继续”复选框。 他负责确保调试器不会每次都在断点处停止,并自动继续使用新添加的命令。 现在,向上滚动到表格的开头,然后向下拖动以刷新。

瞧,新的帖子被加载并替换了旧的帖子,因此,帖子计数器被更新。

我们解决了第一个问题,获得了您的防虫武器,我们继续进行第二个问题。

2.由于连接问题,用户未收到任何通知(使用警报控制器)HTTP请求尚未完成的通知。

如何重现错误:

  • 断开iPhone /模拟器中的Internet连接。
  • 向上滚动到表格的开头,然后向下拖动以刷新。
  • 由于互联网连接错误,将不会下载新帖子。
  • 没有向用户显示任何错误通知。

转到实用 标记“网络”部分中的PostsTableViewController 。 它只有一个loadPosts函数。 它使用公共网络管理器实例执行GET HTTP请求,该请求通过“成功”完成处理程序返回帖子数组,或者通过“失败”完成处理程序返回NSError

我们需要将代码添加到“未成功”的关闭中,以显示警报控制器。 如果转到实用标记支持部分,您将看到已经有一个presentNetworkFailureAlertController函数负责显示所需的警报控制器。 我们需要做的就是在loadPosts的“失败”闭包中调用此函数。
传统方法是停止模拟器并添加所需的代码。 让我们走另一条路!

在该行之后的“未成功”关闭中添加一个断点

目标c

 [self updateUIForNetworkCallEnd]; 

斯威夫特

 self.updateUIForNetworkCallEnd() 

双击已安装的断点或右键单击“编辑断点”,然后单击“添加操作”按钮。 还要选择操作类型“ Debugger Command”。

将以下命令添加到调试器。

目标c

 expression [self presentNetworkFailureAlertController] 

图片

斯威夫特

 expression self.presentNetworkFailureAlertController() 

图片

确认已选中“评估操作后自动继续”复选框。
在Internet关闭的情况下,向上滚动到表格的开头并向下拖动以进行更新,或者您可以向下滚动至表格的末尾并尝试加载新帖子。 这是您将看到的:

图片

我们刚刚做的事情就是使用在特定断点处添加到调试器的命令来注入代码。

小总结

让我们再次列出可以使用添加到断点的调试器命令执行的操作:

  • 使用现有的属性值进行操作。
  • 添加新的代码行。

两项任务均在程序执行期间完成。 我们基本上不需要停止编译器来修复错误并重新启动应用程序。

接下来呢?

此外,我提醒您注意文章第二部分 ,我们将在其中纠正更多的错误,并找出另一种断点(断点)-观察点(观察点)。

Source: https://habr.com/ru/post/zh-CN431506/


All Articles