概述

总体来看,关于Xcode调试的方法包括有以下几个部分:

  1. 日志输出&&LLDB
  2. 断点
  3. 性能

日志输出和LLDB

关于日志输出,最先可能想到的是在代码编辑区的NSLog(),虽然在打印的时候很清晰,但是缺点就是在我们需要在想要打印的位置添加NSLog代码并重新运行项目,这样会比较耽误时间,影响开发效率,而我们在调试过程中用的比较多的是打断点,然后 p 或者 po 一下。这个 p 和 po 就是LLDB中的打印(print)命令

LLDB命令行

像下图中,在29行中打了断点,在控制台的右边会出现一个"lldb"的对话窗。

xcode15调试ios17 xcode 调试_控件

1.help命令

在lldb中输入help,然后回车,可以看到lldb的一些常用的命令,如下图所例。常用的命令为po、p、expression、call

xcode15调试ios17 xcode 调试_Shell_02

2.p

p是print 的缩写:该命令如果打印的是简单类型则会列出简单类型的的类型和值,如果是对象会打印出对象的地址。

3.po

po,print Object 的缩写,用于输出OC对象

4.expr

expr:expression的缩写,可以在调试时动态执行指定表达式,并将结果打印出来。常用于在调试过程中修改变量的值。

xcode15调试ios17 xcode 调试_调试器_03

5. image命令

image list 查看工程中使用的库
image lookup --address 0x000000010e0979ac 程序崩溃的时候定位,查看具体报错位置

LLDB调试对话窗

xcode15调试ios17 xcode 调试_Shell_04


从左到右依次功能为:

  1. 显示/隐藏控制台
  2. 显示断点之前的程序信息(包括变量等)
  3. 点击这个按钮程序就会跳过当前断点,恢复运行
  4. step over ,点击这个按钮会一步一步的运行,方便调试
  5. 点击这个按钮会进入函数内部
  6. 点击这个按钮会跳出函数内部,一般与左边的按钮对应使用
  7. 视图调试器(可以查看图层),下面详细介绍
  8. menory graph 内存结构图,方便查看堆栈信息

  9. 模拟器定位开关

视图调试器 Debug View Hierachy

xcode15调试ios17 xcode 调试_调试器_05


Debug View Hierachy:调试视图层次,除了点击控制台出的图标,也可以从菜单中选择Debug > View Debugging > Capture View Hierarchy 来启动视图调试。在断点或者不是断点的情况下都可以通过点击这个按钮查看视图层级关系。

xcode15调试ios17 xcode 调试_控件_06


有了这个图层关系,我们可以很清楚的知道页面上边的各个控件的位置关系,因为我们在开发测试阶段,某个控件上边的字不显示,或者控件的字被遮挡,我们可以用视图调试器查看,是否控件是frame设置的不合理。

断点

断点里面根据作用和功能也有很多种类:普通断点、条件断点、异常断点、符号断点等。

普通断点

当程序运行到断点处时会暂停运行。比如断点打在30行,那么程序就会停在30行(注意:程序只运行到了前29行,第30行其实还没有被执行。)。只要在代码行旁边点击,就能添加一个断点,再次点击,断点变成浅蓝色,就能让断点不可用(disable了,仍然存在,只是不起作用了)。

xcode15调试ios17 xcode 调试_Shell_07

条件断点

打上断点之后,对断点进行编辑,设置相应过滤条件。单击右键会弹出选项框,四个选项分别为:

Edit BreakPoint:编辑断点。

Disable BreakPoint :断点失效。(相当于上边说到的单击断点变成浅蓝色,断点失效)

Delete BreakPoint :删除断点。

Reveal in BreakPoint Navigator :在左边的断点树状结构表明该断点。

这里我们主要用到的是第一个:Edit BreakPoint。这里面设置断点的筛选条件(双击断点也可以快速进入编辑断点的对话框)。

  1. Condition:返回一个布尔值,当布尔值为真触发断点,一般里面我们可以写一个表达式。
  2. Ignore: 忽略前N次断点,到N+1次再触发断点。
  3. Action: 断点触发事件,分为六种:
1. AppleScript:执行脚本。
   2. Capture GPU Frame:用于OpenGL ES调试,捕获断点处GPU当前绘制帧。 
   3. Debugger Command:和控制台中输入LLDB调试命令一致。
   4. Log Message:输出自定义格式信息至控制台。
   5. Shell Command:接收命令文件及相应参数列表,Shell Command是异步执行的,只有勾选“Wait until done”才会等待Shell命令执行完在执行调试。
   6.  Sound:断点触发时播放声音。
  1. Options(Automatically continue after evaluating actions选项):选中后,表示断点不会终止程序的运行。

Condition:这里我设置i==5,我们看LLDB控制台打印结果:

xcode15调试ios17 xcode 调试_Shell_08


这里打印了0-4,然后断点断了。这样做的目的就是我们不用在循环里面一个一个的点击下一步,直接跳至我们想要看到的那一步。Ignore:这里我把Condition的条件取消,设置Ignor的条件为3,我们看LLDB控制台打印结果:

xcode15调试ios17 xcode 调试_控件_09


结果是将0-2的循环直接忽略,而后边的循环依旧每次在断点的位置断一次。

异常断点 Exception Breakpoint(全局断点)

异常断点可以快速定位不满足特定条件的异常,比如常见的数组越界,这时候很难通过异常信息定位到错误所在位置。这个时候异常断点就可以发挥作用了。

xcode15调试ios17 xcode 调试_xcode15调试ios17_10


同样的,全局断点也是可以编辑的,单击右键或者双击断点就会弹出编辑框,编辑的项目和上述是一样的。

符号断点 Symbolic Breakpoint

符号断点的创建也同异常断点。一般符号断点可以在你指定的[类名 方法名]时中断执行。

xcode15调试ios17 xcode 调试_控件_11

性能检测:

(1)静态分析:通过对代码静态分析,找出代码潜在的错误,如内存泄漏、空引用、未使用函数等。
方法:菜单“Product"->"Analyze"或者Shift+Command+B,然后想办法消灭蓝箭头。