【iOS】Bug调试

文章目录

  • 前言
  • 一、定位编译错误
  • 二、设置与查看断点
    • 1.文件行断点设置
    • 2.符号断点设置
    • 3.Exception Breakpoint
    • 4.Constraint Error Breakpoint
  • 三、调试工具
  • 四、输出窗口
  • 五、变量查看窗口
  • 六、查看线程
  • 七、LLDB调试工具
    • 1.p,po命令
    • 2.expr命令
    • 3.bt命令


前言

在我们的编码过程中我们出现bug在所难免,有时找出这些bug十分耗费精力,调试可以帮我们找出程序中的bug,笔者特此撰写以下博客记录iOS中使用Xcode找出bug的高效方法

一、定位编译错误

Xcode为我们在我们编译时或是编译后会将问题以红色感叹号报告给我们,这里不再赘述。
【iOS】Bug调试_第1张图片

二、设置与查看断点

编写代码时常常会出现我们始料未及的结果,为了找出原因,我们可以用断点来帮助我们,笔者接下来主要介绍三种类型的断点
【iOS】Bug调试_第2张图片

1.文件行断点设置

文件行断点比较简单,我们直接点击文件中的行号即可
在这里插入图片描述
断点可以进行删除,禁止与使用

当我们右击断点时,我们可以选择Edit Breakpoint,他的意思是断点编辑对话框,在其中我们可以为断点设置触发条件与忽略次数,并添加动作
【iOS】Bug调试_第3张图片

例如:
【iOS】Bug调试_第4张图片
我们想看看i8时的情况,可以在Condition中设置i8,然后我们对其添加断点,可以得到
【iOS】Bug调试_第5张图片
在这里插入图片描述
同时在Ignore中设置次数为8,也可以达到同样的效果
【iOS】Bug调试_第6张图片
在这里插入图片描述


2.符号断点设置

Xcode中为我们设计了好几种全局断点,符号断点也属于我们全局断点中的一种
在这里插入图片描述
我们可以在这里看到所有断点

【iOS】Bug调试_第7张图片
打开“+”号面板我们可以看到所有的全局断点【iOS】Bug调试_第8张图片

Symbolic Breakpoint就是我们的符号断点,符号断点会在执行到特定符号时暂停程序。

设置好符号断点后需要进行编辑,在 Symbol 填入符号,符号有以下几种:

方法名,其会暂停所有该符号的调用。例如: removeFromSuperview,只要调用了removeFromSuperview·会暂停程序执行
类的一个方法。例如: -[MyView1removeFromSuperview]
C 函数。例如: c_func

像以下这三种断点就是符号断点
在这里插入图片描述
进入编辑方式:选中断点导航面板中设置的符号断点,点击右键,选择 Edit Breakpoint 即可进入下图编辑面板
【iOS】Bug调试_第9张图片

3.Exception Breakpoint

我们的程序常常会直接崩溃在main函数
【iOS】Bug调试_第10张图片
当遇到这种问题时候我们就需要一个Exception Breakpoint

例如我这里出现了数组越界的问题,当我加上了这个断点之后会自动帮我定位到出现问题的数组位置
在这里插入图片描述
我们还可以在断点的action中添加po $arg1,便可以打印出异常对象的信息
在这里插入图片描述
这里建议程序运行时始终执行这个断点,有利于节约我们的时间

4.Constraint Error Breakpoint

一个自动布局约束错误断点,其可以帮你快速定位自动布局错误,但其并不常用,会在我们使用Masonry进行自动布局时用到。
当我们的控件之间有约束错误,这个断点会自动识别,并且通过查看堆栈我们可以看到具体是哪一个控件出了问题
在这里插入图片描述
在这里插入图片描述
在以上程序中笔者故意对_reply控件进行了错误的约束,查看堆栈发现其自动帮我们找到了约束错误的控件


三、调试工具

Xcode提供了强大的调试功能,当断点挂起时,就会进入调试界面
【iOS】Bug调试_第11张图片

这是调试工具栏:
【iOS】Bug调试_第12张图片
调试工具栏中有许多按钮:
例如当断点挂起之后,点击继续执行按钮可以继续执行
单步跳过按钮单步执行,遇到方法与函数时不进入
单步进入按钮则是进入方法或者函数里, date = [self.homeModel pastDateForJson:numbersOfLoad];这段代码中点击单步进入程序就会进入pastDateForJson方法中,如果点击单步跳过则不会进入
单步跳出按钮在进入方法或函数后想跳回原来调用他的地方时使用

四、输出窗口

使用窗口显示按钮可以控制同时显示左右两个窗口(变量查看窗口与输出窗口),或者只显示其中一个窗口。输出窗口有三种选择——All Output、Debugger Output与Target Output
调试程序时可以在Debugger Output窗口中执行调试命令
Target Output窗口则显示一些输出以及报错信息
【iOS】Bug调试_第13张图片

五、变量查看窗口

位于调试窗口左侧,用于查看变量与寄存器内容,与输出窗口相同,也有多种选项
在这里插入图片描述

【iOS】Bug调试_第14张图片
同时右击变量还可以对变量进行多种操作
【iOS】Bug调试_第15张图片
例如我们点击printf变量,便会在输出窗口出现如下输出
在这里插入图片描述

六、查看线程

Xcode中有两种方式支持我们查看线程
一种是在跳转栏中选择线程下拉列表,选择某个线程后,Xcode会显示一个代码运行的栈
【iOS】Bug调试_第16张图片
另一种方法就是点击毛毛虫,也可以显示线程与其堆栈
【iOS】Bug调试_第17张图片

七、LLDB调试工具

我们在上文用到的方法其实都可以用LLDB调试工具做到,这里笔者简单说几个常用的LLDB命令

1.p,po命令

p命令:查看基本数据类型的值
po命令:查看oc对象
【iOS】Bug调试_第18张图片
在这里插入图片描述

2.expr命令

expr命令:全称expression,可以在调试时动态修改变量的值同时打印出结果。使用expr命令动态修改变量的值,可以在调试的时候覆盖一些异常路径,对调试异常处理的代码很有用。
在这里插入图片描述

3.bt命令

bt命令可以查看线程的堆栈信息,该信息也可以在导航区的Debug Navigator看到;
bt:打印当前线程栈 bt all:打印所有线程栈

在学习多线程的时候可能会用到
【iOS】Bug调试_第19张图片

还有一些更多的方便命令我们可以通过在lldb中打入help进行学习
【iOS】Bug调试_第20张图片

你可能感兴趣的:(ios,bug)