初学者的Xcode调试(1):工具

调试是开发人员的惯常做法,可能会占用大量时间并带来深深的挫败感。 轻松快捷地进行调试始终是一个令人愉快的目标。 让我们探索一些可以立即应用的调试工具!

NSLog(Obj -C)/打印(Swift)

在控制台中打印是一种常用的调试方法,尤其是在无法添加调试器(例如在生产应用程序中)或尝试调试竞争条件问题的情况下无法使用断点时。 但是,它需要比其他调试方法更长的时间,因为它要求您在每次更改日志消息时都重新运行该应用程序。 您还需要记住在完成调试后清理它们,尤其是当记录的消息包含敏感信息时。

基本断点用法

调试而不接触代码库的一种常见方法是设置断点。 您所需要做的就是单击代码编辑视图左侧的行号,然后会出现一个蓝色的断点箭头。

以下是使用断点的最常用方法:

  • 检查Xcode调试区域左侧面板中的变量; (要查看该实例的属性,请单击变量左侧的箭头。)
  • 键入po (打印对象)或直接在控制台中使用变量名进行print

您可以通过单击调试区域右下角的两个按钮来显示或隐藏左右面板。

有时,您可能会发现未显示变量值,但显示了“ 无法读取数据 ”错误,或者即使您知道这是一个谎言,也将这些值显示为nil 。 这通常是由于构建设置中的优化级别所致。 确保在“ 调试 ”配置中将其设置为“ ”。 当您使用Cocoapods并尝试进入Pod的代码时,请确保您在Pods项目的相应Pod目标中检查了优化级别。

基本的断点工具可以解决很多调试需求,但不是全部。 当您要调试竞争条件时,在断点处停止永远不是最好的方法。 另一种情况是您不知道在哪里放置断点。 例如,您希望程序在引发错误的地方停止。 为了调试这些情况,我们需要深入研究更高级的断点用法。

高级断点用法

更多类型的断点

在Xcode的左侧,单击导航区域中的断点图标。 您可以在左下角看到一个“ + ”按钮,它允许您添加不同种类的断点。 以下是一些常用的断点类型:

  • 建议使用“ 异常断点 ”来捕获异常并显示相关信息。
  • Symbolic Breakpoint ”使您可以停止无法访问的方法。 它通常用于阻止第三方库或iOS框架的方法。 例如,您可以使用-[UIViewController viewDidLoad]为该方法创建一个断点。

暂时禁用断点

您可以单击断点以启用/禁用它。 您也可以将断点拖到另一行或将其拖到代码编辑区域,然后释放鼠标将其删除。

编辑断点

右键单击该断点,将显示编辑断点的选项。 单击“ 编辑断点… ”。

现在您可以自定义断点了。 这里最有用的事情之一是为断点添加额外的操作:

以下是不同类型的操作及其用法:

  • 记录消息 ”允许您在运行时记录消息,而无需触摸代码。
  • Debugger Commands ”接受控制台的任何命令。
  • 当您只想知道一行代码是否被调用,何时被调用以及被调用多少次时,“ Sounds ”是最佳选择。

您可能会注意到选项“ 评估操作后自动继续 ”。 这使您可以在不停止代码的情况下进行调试,这样可以节省一些时间,然后单击“ 继续 ”按钮。

使用Debugger Command ,还可以在运行时通过使用expr来更改变量,如下所示:

内存调试

内存泄漏是编程中最常见的问题之一,通常很难调试。 除了一次又一次地阅读代码以查找泄漏之外,您还可以使用Xcode来检查每个线程堆栈跟踪和所创建对象的映射。 您需要做的就是右键单击调试面板中的项目。 这是Xcode的一些屏幕截图。

按线程查看进程

查看UI层次结构

当UI元素过多并且看不到小的组件时,可以拖动滑块以将UI元素拉得更远,以更清晰地查看层次结构。 您也可以单击其中一个视图,以在左侧的调试面板中查看更多详细信息。

查看内存图层次结构

这显示了程序中的对象。 您可以单击某些对象的箭头以展开地图。

结论

在这里,我介绍了最常见且易于使用的调试工具。 它们应涵盖大多数常见的调试情况。 如果您有兴趣并想进一步挖掘,可以尝试Chisel,一个好玩的地方。

现在您知道了更多的调试工具,这是否意味着您知道如何调试? 如果您不确定,那就可以了! 我将写另一篇文章介绍一些调试策略,这些策略将帮助您更有效地进行调试。 敬请期待。 🙂