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

下午好,今天,我提请您注意有关在LLDB中调试应用程序的文章的第二部分。

在第一部分中,我们了解了如何在Xcode中使用断点来修改变量的现有属性并通过指令命令添加一行代码。

我故意创建了一个带有一些错误的演示项目,以弄清楚如何在LLDB中使用不同类型的断点来调试应用程序。

如果您没有研究本文的第一部分,则最好从本文开始。 让我提醒您一下本教程的一条重要规则:在本文结束之前,您不会停止编译器,也不会在首次启动后重新启动应用程序。 您可以在程序执行过程中更正错误。

观察点

因此,应用程序中出现以下错误:

3.您可以加载帖子超过7次。

如何重现错误:

  • 在您的iPhone /模拟器上打开Internet
  • 向下滚动到表格的末尾以加载更多帖子。
  • 您可以加载帖子7次以上(尽管在此应用程序中,用户不应有这种机会)。

作为检测错误的选项之一,您需要了解在页面上加载新帖子后如何更新整数变量pageNumber 。 由于您仍然不熟悉我的代码,因此需要花一些时间来了解代码中正在发生的事情。

不用担心 应用一些魔术。

从本文的第一部分中,我们了解到GET HTTP请求是在实用标记“网络”部分中执行的。 它仅包含一个loadPosts函数。 在此函数的第一行上放置一个断点,并将表格向下拖动以进行更新。 编译器将在此断点处停止。

图片
目标c

图片
斯威夫特

在调试器的底部窗口中,单击“显示变量”按钮。 左侧将弹出一个新窗口,您将在其中看到所有变量PostsTableViewController。

图片

将光标指向pageNumber,右键单击并分别为Objective-C和Swift选择“ Watch _pageNumber” /“ Watch pageNumber”。

图片
目标c

图片
斯威夫特

因此,您为pageNumber变量创建了所谓的监视点。 监视点是一种断点,可以在每次将变量的值设置为更改时停止调试器。

图片
目标c

图片
斯威夫特

继续执行程序。 调试器停止,您将看到类似以下的内容:

目标c

图片

  1. 记录pageNumber变量的旧值和新值。
  2. 跟踪更改pageNumber变量的值的代码堆栈。
  3. 导致pageNumber变量更改的当前点是此变量的setter方法。

如果您参考堆栈跟踪中的步骤1,它将带您到以下代码段:

图片

斯威夫特

图片

  1. 调试器会通知您您设置的观察点已经显示出一些东西。
  2. 跟踪更改pageNumber变量的值的代码堆栈。
  3. 导致pageNumber变量更改的当前点是updateForNetworkCallEnd函数。

可以断定,每次成功执行HTTP GET请求后, pageNumber变量都会递增1,直到状态变量(枚举类型)处于“活动”状态。 此变量可以具有2个状态:活动(“活动”)或不活动(“非活动”)。 “活动”状态意味着用户可以加载帖子(即,尚未达到7个下载的限制)。 相反,“非活动”状态假定用户将不再能够加载帖子。 结果,我们需要向updateForNetworkCallEnd函数添加逻辑,该逻辑将检查pageNumber变量并将状态变量设置为适当的状态。

您可能已经猜到了,在更改代码之前先停止假设而不停止编译器要容易得多。

我注意到在实用标记支持部分中,我们已经有了所需的函数( setToInactiveState ),该函数将状态变量设置为“ inactive”。
if条件上方一行添加断点。 还将以下指令命令添加到调试器。

目标c

expression if (self.pageNumber >= 7) {[self setToInactiveState]} 

图片

斯威夫特

 expression if (self.pageNumber >= 7) {setToInactiveState()} 


图片

之后,删除用于设置观察点的第一个断点。 同时禁用监视点本身。

图片
目标c

图片
目标c

图片
斯威夫特

图片
斯威夫特

现在向上滚动表格,向下拖动以刷新并开始翻转。
一切顺利! 但是现在还为时过早,我们还有一个错误需要修复!

接下来是什么?

本文的最后一部分,第三部分,我们了解了另一种类型的断点-符号断点(符号断点)。

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


All Articles