执行动作,不要停止执行

正确使用调试工具可以帮助开发人员节省大量时间。 例如,考虑最基本的断点:它使我们能够暂停程序的执行,以便逐步对其进行分析。 现在,只需考虑通过手动在每行上添加输出到控制台来执行该过程所花费的时间。 事情很快就会变得一发不可收拾,难以管理。

事实证明,我们大多数人习惯的标准断点只是冰山一角,而且Xcode拥有一整套方便的工具,旨在加快调试工作流程。

让我们从我们大多数人已经经历过几次的事情开始:我们设置一个断点,当它被触发时,我们键入一个命令,例如po myVariable ,然后继续执行。

当然,如果我们需要执行多次以上,此手动操作将变得非常繁琐。 幸运的是,将其自动化非常简单:

  • 右键单击断点>“编辑断点…”
  • 点击“添加动作”
  • 选择“调试器命令”
  • 输入您的命令
  • 选中“评估操作后自动继续”

从现在开始,无论何时触发此断点,都将执行自定义调试器命令,并且此后将立即恢复执行,从而无需进行任何手动操作。 节省了很多时间👍

有时我们希望仅在满足特定条件时才触发断点。 再一次使用“ Edit Breakpoint…”,设置这样的条件非常容易:

在此示例中,条件非常简单,但是可以使用布尔运算符( &&||! ,…)执行函数调用,因此可以更轻松地处理更复杂的表达式。

相反,有些时候我们希望断点仅从第二次触发就停止执行。 例如,考虑一下在创建对象时第一次调用该函数,然后在事件发生时再次调用的函数。 如果我们只想调试第二种调用,最好过滤掉第一种。

再次使用“编辑断点…”选项已经在等待我们:

当引发异常或错误并没有捕获到异常或错误时,应用程序崩溃,并且调用堆栈被打印到控制台。 此输出通常对于识别错误的来源非常有帮助,但实际上并不允许检查引发错误的情况。

那是一种新的断点开始起作用的时候。 到现在为止,我们使用的所有断点都以某种方式固定在我们的代码上,这意味着它们已在应用程序的特定行上显式设置。

为了设置在发生错误时触发的断点,我们需要查看符号断点的侧面,这意味着不与特定行链接的断点,而是与定义良好的事件相关的断点,在本例中为发生错误。

为此,Xcode已经提供了两种此类断点,具体取决于您是否对Swift或Objective-C错误感兴趣:

很棒的事情是,您还可以编辑它们,以便通过过滤特定的Swift.Error类型或在引发错误或Swift.Error错误时触发来使它们更加适合您的需求。

异常和错误断点是一种特殊的符号断点,但是也可以定义更多的通用断点。

例如,可以创建一个断点,该断点将在控制器上调用viewDidLoad()时触发:

当您知道正在调用某个方法(例如,一个模态控制器被关闭)并且您试图查明此调用的源时,这可能是一个非常有用的工具。

我们所有人都面临着AutoLayout问题。 通常,我们通过控制台错误消息了解这些运行时问题,这些错误消息指出自动布局引擎“无法同时满足约束条件”。

但是,在复杂的应用程序中,要弄清楚哪个视图恰好触发了错误,可能会很复杂。 查明根本原因的一种好方法是在项目中添加“约束错误断点”。

然后,每当发生新的自动布局问题时,断点将自动触发👌

Xcode 11中的新增功能,引入了一种新型的符号断点。 它称为“运行时问题断点”,实际上实现了以前必须在编译方案中启用的检查。

其中,您会找到一个“主线程检查器”,该“主线程检查器”将在从后台线程访问UIKit或AppKit对象时被触发,或者会找到一个“线程清理程序”来帮助您检测竞争状况。

当您考虑它时,断点就是专注于应用程序代码的构造。 但是,应用程序是由代码和数据组成的,因此具有等同于断点的功能当然很有用,以便观察数据在应用程序运行时如何变化。

碰巧的是,这样的构造在Xcode中已经可用,尽管它不像断点那样可见,它被称为watchpoint

要在变量上设置观察点,首先必须设置一个断点,该断点将停止在该变量可访问的内存帧中的执行。

然后,您只需要右键单击该变量,然后选择“监视”:

另外,也可以通过调试控制台创建观察点: watchpoint set variable self.counter

然后可以禁用断点,并且只要变量值发生更改,就会触发监视点。

断点和观察点是非常强大的功能,如果使用得当,它们可以非常有效地帮助加快应用程序的调试过程。

本文的目的不是详尽列出断点实现的所有功能,因此请随时阅读有关此主题的更多信息。 一个很好的起点就是与调试器进行交互的命令行语法。


最初发布在 gist.github.com上