使用LLDB在Xcode中进行调试

数据冒险

犯了错误

有时,我们会对不正确的事情做出假设。 这种说法似乎很明显,这是人的天性。 编写软件时,最好质疑您的假设是否正确。 很多时候,您会发现,仔细检查后发现事情与最初出现的情况并不完全相同。

🤔挑战你的假设

使用Xcode时,可以质疑我们的假设的一种方法是使用调试器。 调试器是一种工具,可让您使用细粒度的控件检查和操纵代码执行。 通过调试,您可以更好地了解您的代码在做什么。

这篇文章旨在简要概述Xcode中的调试以及一些可以帮助您的工具。 我打算就调试主题撰写一系列文章,这是第一篇。 调试的主题非常广泛,本文并不旨在提供完整的概述。 如果您觉得缺少什么,请继续关注本系列的更多帖子。 另外,请随时给我评论。

崩溃的土地之旅

这听起来可能有些奇怪,但是可以将代码崩溃视为旅途。 当您点击运行时,它开始运行并编译。 在此过程中,它继续使用方法并具有许多特性。 最终,它成功地找到了坠机土地。 当您开始调试时,您只有一小幅图片。 您有起点和终点,但要知道如何到达那里,就需要追溯旅程的步骤。 为了帮助您完成旅程,Apple向您赠送了一个有价值的物品LLDB调试器。

控制台和LLDB

LLDB是Apple提供的软件调试器,它是Xcode中的标准调试工具。 LLDB是一个功能强大的工具,可将应用程序分解为各个组件。 它的用途不仅限于Xcode IDE,即使您无法访问其源代码,也可以使用LLDB分解并检查应用程序。 鉴于功能和用途的广泛性,本文的含义更像是粗略的概述,我不想通过详细研究这些内容而超出范围。

调用堆栈

使用LLDB,我们能够检查调用堆栈以及堆栈中的特定堆栈帧 。 调用堆栈是由应用程序创建的数据结构,用于跟踪其所有行为。

数据结构

堆栈数据结构只是一个队列,在队列中添加的最后一个元素是从中返回的第一个元素(LIFO队列-先进先出)。这与物理世界中的情况大同小异:一堆砖的顶部(如果您从底部取出,即添加的第一块砖,它们都将崩溃。)

堆叠框架

在调用堆栈中有称为堆栈帧的结构。 堆栈框架包含有关为其创建执行的信息。 在调试时,许多此类信息可能会变得有用。 数据范围从局部变量到完成时返回的内存地址。

苹果文档:

程序运行时,它将有关正在执行的操作的信息存储在称为调用栈的数据结构中。 每次调用方法时,程序都会在调用堆栈的顶部推入一个新的堆栈框架 ,其中包含以下内容:传递给该方法的参数(如果有),该方法的局部变量(如果有的话)以及指向该地址的地址。方法调用完成后返回。

断点

如果您不熟悉代码断点,请允许我给您简要介绍一下。 在Xcode中,断点使您可以在特定点中断代码的执行。 这很有用,因为它使您可以在给定的时刻详细检查应用程序的状态。

断点类型

象征绕道

在进一步进入断点之前,让我们先谈谈符号化。 符号化是将内存地址映射到更简单的函数名称。

返回我们以前计划的编程

处理断点时,重要的是要了解有不止一种类型。 让我们简要地谈谈一些重要的类型:

Xcode换行符 —断点的基本类型和最容易使用的类型是可以在Xcode编辑器的侧面添加的类型。 执行该行时,此断点将中断您的代码。 这对于您非常了解哪里出了问题的情况非常理想。

异常 -异常断点也是常用的类型。 当Xcode引发异常而不是错误时,异常断点会中断您的代码。 如果您不确定哪里出了问题,这是查看崩溃前发生情况的好工具。

有条件的 -使用断点的另一种方法是设置条件,在该条件下应用程序将中断其执行。 这可能像对属性进行零检查一样简单。 当您不确定代码中的给定值来自何处时,这将非常有用。

象征性的 -最后,还有象征性的断点。 这些有点棘手。 符号断点有点像谓词,用于根据功能过滤何时中断代码。 例如,您可以在实例化对象时使用符号断点。

尽管有多种方法可以实现它们,但从根本上讲,断点是一个简单的概念。 苹果对断点有一个很好的定义:

断点是一种机制,可以在执行期间在预定位置暂停应用程序,以检查变量的状态和应用程序的控制流。 断点有几种,可以对其进行编辑以添加条件,操作和脚本。 尽管您可以随时使用调试器暂停应用程序,但在应用程序运行之前甚至运行时设置断点很有帮助,这样您就可以在断定可能出现问题的已知点上将其暂停。

垫脚石

我想在文章中最后谈到的调试的最后一个方面是,您在遇到断点后可以进行代码探索。 您可以说可以采取一些步骤。

单步执行 —当您“单步执行”时,Xcode将运行当前语句,并在下一条语句处停止。 如果该语句是一个函数,它将在停止之前完整执行。

进入 -当您进入Xcode时,将执行当前语句,但是,如果这是一个函数,则Xcode将进入该函数的执行,然后暂停。

包起来

这不是我对这个话题的最终决定。 我们可以从中探索更多的内容,我什至不称此帖子为完整的介绍。 这篇文章是对简介的介绍。 正如我之前提到的,LLDB允许我们探索原本会隐藏的世界,并分解我们无法访问的代码。 这就是乐趣的开始!

LLDB主页
为了实现我们的目标,我们决定从一种支持现代多线程的新架构开始…… lldb.llvm.org 读取iOS堆栈跟踪-Apteligent
新的应用更新刚刚在AppStore上发布。 一切看上去都很完美,所以您决定早点离开,然后… www.apteligent.com 检查呼叫堆栈
记录LLDB命令行调试器的概念,功能和使用的指南。 developer.apple.com 关于LLDB和Xcode
解释LLDB功能和语法。 包括GDB到LLDB命令等效项的列表。 developer.apple.com Swift算法俱乐部:Swift Stack数据结构
Swift算法俱乐部是一个开源项目,旨在通过以下方式在Swift中实现流行的算法和数据结构: www.raywenderlich.com