ios调试技巧(2) 设置符号断点暂停你的程序

1,689 阅读7分钟

设置断点以暂停正在运行的应用程序

断点调试相关

developer.apple.com/documentati…

概述

当您在源代码中找到出问题的位置时,可以设置断点,以便您可以检查变量并单步执行代码找出问题。

要定位难以知道在哪里设置断点的崩溃或其他错误,请使用符号断点或issue breakpoints来暂停特定的问题条件并快速确定错误发生的位置。

对于在多次迭代后或仅在某些情况下出现的错误,请在断点上指定条件。如果你想在应用程序的specific points,或者在某一行执行时receive notifications 你可以使用breakpoint actions

Specify Where to Pause Your App (指定断点的位置)

导航到代码中要暂停执行的行,然后单击源代码编辑器中的间距或行号以设置断点。 Xcode 显示一个断点图标来指示位置。

setting-breakpoints-to-pause-your-running-app-1@2x.png

向上或向下拖动断点以将其移动到另一个位置;将其移除。单击调试区域工具栏中的断点图标可激活或停用所有断点。

Manage Breakpoints Across Your App

当您在多个源代码文件中设置了多个断点时,单击主窗口导航器区域中的断点导航器按钮以打开断点导航器以查看和管理所有断点。

setting-breakpoints-to-pause-your-running-app-2@2x.png

单击断点导航器中的断点标签可快速导航到源代码编辑器中的断点。选择断点标签后按 Delete 键可从代码中删除断点。单击断点导航器中的断点图标以启用或禁用它。

要在导航器中轻松找到常用断点,请按住 Control 键单击断点标签,选择“编辑断点”,然后为其输入名称。然后使用断点导航器底部的过滤器。

您还可以使用过滤器在断点的代码行中按符号查找断点。过滤器工具提供了仅显示修改断点和仅显示启用断点的选项。

Specify Conditions for Pausing Your App (指定暂停应用的条件)

对于在一定次数的迭代之后出现的bug,或者在需要重复动作的有限条件下,在断点处暂停并反复按Continue按钮直到bug出现是很麻烦的。有两种方法可以在调试器中更有效地处理这种情况。

对于在一定次数的迭代后出现的错误,将调试器设置为忽略某些迭代的断点。按住 Control 键单击断点,选择 Edit Breakpoint,然后指定在停止之前忽略断点的次数。

setting-breakpoints-to-pause-your-running-app-3@2x.png

对于在有限条件下发生的错误,请将调试器设置为在表达式为真时在断点处暂停。按住 Control 键单击断点,选择 Edit Breakpoint,然后使用本地范围内可用的变量输入条件。

setting-breakpoints-to-pause-your-running-app-4@2x.png

调试器每次到达执行断点时都会计算表达式,并且仅当表达式为真时才会暂停。

Pause on a Symbol Outside Your Code (在代码外的符号处暂停)

要调试某些问题,您需要在源代码未定义的符号上暂停。例如,当您遇到自动布局问题时,错误消息建议在 UIViewAlertForUnsatisfiableConstraints 上设置断点。为此,请使用符号断点。

在断点导航器中,单击左下角的添加按钮 (+),然后选择符号断点。使用示例文本的格式在符号字段中输入对象和符号。

setting-breakpoints-to-pause-your-running-app-5@2x.png

当应用程序或您的代码调用您指定的符号时,调试器会暂停。示例符号 UIViewAlertForUnsatisfiableConstraints 通常在应用程序的 main 方法中暂停,而不是在代码中的一行。发生这种情况时,使用控制台查看带有 po [[UIWindow keyWindow] _autolayoutTrace] 的自动布局跟踪。


提示:

一些符号非常频繁地被调用,并且在每个符号上暂停可能不好处理。向断点添加条件以减少调用频率,或禁用符号断点,直到代码中到达要开始查找问题的断点,然后启用符号断点。

Pause on an Uncaught Swift Error or Objective-C Exception (暂停未捕获的 Swift 错误或 Objective-C 异常)

当您的应用遇到未处理的 Swift 错误或 Objective-C 异常时,它会崩溃。通常,堆栈跟踪不会直接指向问题发生的位置。设置断点以在未捕获的 Swift 错误或 Objective-C 异常上暂停,以便您定位问题。

当一个未处理的 Swift 错误导致崩溃时,调试器会在 try! 行显示一个致命错误。而不是最初发生错误的地方。

setting-breakpoints-to-pause-your-running-app-6@2x.png

如果抛出的错误有有用的错误消息,那么这可能足以解决问题。如果没有,请添加一个 Swift 错误断点以在引发错误的行上暂停。在 Breakpoint 导航器中,单击左下角的 Add 按钮 (+),然后选择 Swift Error Breakpoint。然后应用程序暂停抛出的错误而不是 try!。

setting-breakpoints-to-pause-your-running-app-7@2x.png

当未捕获的 Objective-C 错误导致崩溃时,调试器会在 AppDelegate 或 main 方法中显示崩溃。

setting-breakpoints-to-pause-your-running-app-8@2x.png

添加一个 Objective-C 异常断点以在发生崩溃的行而不是 main 处暂停。在 Breakpoint 导航器中,单击左下角的 Add 按钮 (+),然后选择 Exception Breakpoint。

setting-breakpoints-to-pause-your-running-app-9@2x.png

Pause Automatically When the System Detects a Runtime Issue (当系统检测到运行时问题时自动暂停)

Xcode 具有称为 sanitizers 的工具来检测几种不同类型的运行时问题:

1.在主线程之外更新用户界面

2.不安全地更新来自不同线程的变量

  1. 不安全地访问地址以及执行导致未定义行为的代码。

4.Configure your scheme to enable sanitizers 使清理程序能够在构建时通过静态分析检测这些问题。当您禁用清理程序并且您的应用遇到这些问题之一时,您的应用崩溃并且 Xcode 可能无法清楚地识别问题发生的位置。

setting-breakpoints-to-pause-your-running-app-10@2x.png

要暂停您的应用程序并进行调查,请单击断点导航器左下角的添加按钮 (+),选择运行时问题断点,然后选择断点的运行时问题类型。 

setting-breakpoints-to-pause-your-running-app-11@2x.png

为问题启用 sanitizer 并运行您的应用程序。 sanitizer 识别它预期会发生运行时问题的代码行。当应用程序在您的运行时断点处暂停时,调查问题发生的原因。有关详细信息,请参阅及Diagnosing Memory, Thread, and Crash Issues Early.。

Log Variable Values, Run Scripts, or Play Sounds at a Breakpoint   (记录变量值、运行脚本或在断点处播放声音)

无需使用NSLog打印来记录变量值和有关应用程序执行的详细信息,而是使用debugger commands 来记录消息并执行将变量值打印到控制台的调试器命令。

断点动作也可以在调试器到达断点时播放声音,这对于知道代码何时执行而不暂停很有用。断点操作可以执行 AppleScripts 或 shell 脚本来执行有用的调试任务,例如截屏或保存一些应用程序数据以供分析。

要使用断点执行操作,请在源代码编辑器或断点导航器中按住 Control 键单击断点,选择 Edit Breakpoint,单击 Add Action,选择一个操作并提供任何必要的附加信息。例如,为 Log Message 操作提供消息,或为 Debugger Command 操作提供命令和参数。

setting-breakpoints-to-pause-your-running-app-12@2x.png

要在断点处执行多个操作,请单击现有操作右侧的添加按钮 (+) 以添加另一个操作。要在执行操作后继续执行您的应用程序而不暂停,请选择“评估操作后自动继续”选项。