iOS开发进阶(二十):Xcode 断点调试详解

一、前言

所谓断点,其实就是一个让应用暂停运行的机制,这是为了方便开发人员执行调试,查看寄存器的某些值。既然设置了断点,可以让应用停在某一时刻,那么这一时刻应用所处的运行环境便一目了然,这个环境就是案发现场,而断点就是帮助开发人员破案的工具。这个时候开发人员便可以使用各项调试命令,而编译器则会反馈相应线索。

Xcode编译器允许开发人员在代码中的任意位置设置断点,但是如何打断点也是一门手艺,有些断点的设置是毫无意义的,比如将断点设置在了一处声明某个常量的地方,那么编译器便会跳过这处,直到它遇见真正的可执行指令处。

二、断点调试技巧

与断点协同破案的便是断点导航器。下面讲述一些基本的断点调试技巧:

2.1 设置断点

设置断点,就不说了,大家都知道,在你想要调试的代码处点击设置就行了。通过快捷键"Command+"也可以。

2.2 断点的自定义设置

(1)在设置断点的地方,右击该断点,会弹出一个栏,选择Edit Breakpoint,可以对断点进行自定义设置,如下图2-1所示。

在这里插入图片描述

(2)点击Edit Breakpoint选项后,弹出如下设置框

2-2

蓝色对勾后面的,表示当前断点所处的位置。至于代码行数显示你可以在菜单栏Xcode->Preferences->Test Editing->勾选Line Numbers,将代码行数字显示出来。将对勾抹去,表示该断点失效。

  • Condition: 指的是条件表达式,该项允许我们对断点生效设置条件,表示当满足某一特定条件的前提下,该断点才生效。(该条件的录入,不能够识别预处理的宏定义,也不能识别断点作用域之外的变量和方法)。

  • Ignore:忽略次数。它指定了在断点生效,应用暂停之前,代码忽略断点的次数。如果希望应用运行一段时间后断点才生效,那么就可以使用这个选项。比如说在调试某一循环体的时候。

  • Action: 动作。它表示当断点生效时,Xcode作出反应后的行为动作。点击右边的Add Action选项会弹出如下图。

在这里插入图片描述

图中所示红色方框中的选项,可以让指定哪一种动作。默认的是Debugger Command。还有以下几种动作供选择,下面逐一介绍。

  1. AppleScript
    它是苹果提供的一种脚本语言,用来执行一些预先指定的行为。选中该选项,将会出现如下图所示的AppleScript语言的输入框。

2-4

以上设置将弹出一个显示“Hello World!”的对话框。点击Compile按钮后,如果没有错误,会显示成功信息。而点击Test按钮,会测试运行效果,如下图所示。

2-5

至于红色方框中的内容是三种特殊符号相对应的定义。

符号标记 定义
@expression@ LLDB表达式
%B 断点的名称
%H 遇到该断点的次数
  1. Capture GPU Frame
    这个功能用于当断点生效时,捕获GPU当前所绘制的帧。该功能是辅助图形调试的。

  2. Debugger Command
    默认的选项,可以让断点执行LLDB调试命令。

  3. Log Message
    使用Log命令可以生成消息队列,将相关的消息输出到控制台上,还有一个Speak Message选项,可以播报消息。

  4. Shell Command
    该动作接收一个命令文件和参数列表。如下图2-6所示

在这里插入图片描述

命令文件必须是一个可执行的二进制程序或者脚本。可以复制粘贴输入路径,也可以点击Choose按钮选择具体文件。
参数通过空格表示分割,也可以在两个@字符之间包含LLDB表达式。

一般情况下,Xcode会异步执行Shell Command,也就是说,Shell Command 和调试器将会同步执行。如果希望调试器在Shell Command命令完成后运行,则可以勾选下面的Wait until done选项。

  1. Sound
    动作会在断点被触发时,弹出声音提示。

2.3 断点类型

上面讲到的都是普通断点,断点的类型还包括以下几种:

  1. 异常断点
    异常断点是代码出现问题导致编译器抛出异常时触发的断点。它在断点导航器中设置。点击+号,选择Exception Breakpoint选项。如下图所示

在这里插入图片描述

Exception选项可以让你选择响应Objective-C对象抛出的异常,也可以选择响应C++对象抛出的异常。
Break则是选择断点所接收的异常,是接收“Throw”语句抛出的异常还是Catch语句的。

由于有一些异常的出现,是在不满足某些特定条件下而导致的,比如说在复杂循环中数组越界,这个时候往往不容易根据异常信息确定错误的出处,这个时候设置异常断点便能发挥作用。

  1. 符号断点
    可以中断某个方法的调用,可谓是异常强大,在断点导航器界面,点击+号,选择Add Symbolic Breakpoint选项,然后会弹出如下图所示的对话框。

在这里插入图片描述

可以看到它比普通断点的自定义设置界面多出了两个内容,其一是Symbol,用来设置当前断点作用域所能识别的方法,这里面既可以是自定义的方法,也可以是系统的API方法。(注意必须表明是类方法还是成员方法)

另一个Module是模组的意思,用来限制满足符号的方法,编译器将只会在断点满足这个模组的符号的时候才回暂停。

  1. OpenGL ES错误断点(OpenGl ES Error Breakpoint)
    这个断点的作用和异常断点类似,只不过这个断点只有在openGL ES错误发生的时候才会触发。

  2. 测试失败断点
    仅在测试断点失败的时候才会执行,这个时候,应用将会暂停在引发测试失败的代码处,而不是停止在测试代码处。

相关推荐

  1. 【Python)】——程序调试方法

    2024-04-27 18:52:02       37 阅读
  2. iOS开发-Xcode

    2024-04-27 18:52:02       22 阅读
  3. Linux初学()AWK

    2024-04-27 18:52:02       23 阅读
  4. 汽车IVI中控开发入门及):V4L2视频

    2024-04-27 18:52:02       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 18:52:02       75 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 18:52:02       80 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 18:52:02       64 阅读
  4. Python语言-面向对象

    2024-04-27 18:52:02       75 阅读

热门阅读

  1. spring mvc 和 struts 的区别是什么?

    2024-04-27 18:52:02       29 阅读
  2. 新质生产力与科技创新

    2024-04-27 18:52:02       34 阅读
  3. C++ Lambda表达式

    2024-04-27 18:52:02       30 阅读
  4. 推荐算法顶会论文合集

    2024-04-27 18:52:02       23 阅读
  5. 【C++例】虚函数—代码实例

    2024-04-27 18:52:02       27 阅读