在我们的编码过程中我们出现bug在所难免,有时找出这些bug十分耗费精力,调试可以帮我们找出程序中的bug,笔者特此撰写以下博客记录iOS中使用Xcode找出bug的高效方法
Xcode为我们在我们编译时或是编译后会将问题以红色感叹号报告给我们,这里不再赘述。
编写代码时常常会出现我们始料未及的结果,为了找出原因,我们可以用断点来帮助我们,笔者接下来主要介绍三种类型的断点
文件行断点比较简单,我们直接点击文件中的行号即可
断点可以进行删除,禁止与使用
当我们右击断点时,我们可以选择Edit Breakpoint
,他的意思是断点编辑对话框,在其中我们可以为断点设置触发条件与忽略次数,并添加动作
例如:
我们想看看i8时的情况,可以在Condition中设置i8,然后我们对其添加断点,可以得到
同时在Ignore中设置次数为8,也可以达到同样的效果
Xcode中为我们设计了好几种全局断点,符号断点也属于我们全局断点中的一种
我们可以在这里看到所有断点
Symbolic Breakpoint
就是我们的符号断点,符号断点会在执行到特定符号时暂停程序。
设置好符号断点后需要进行编辑,在 Symbol 填入符号,符号有以下几种:
方法名,其会暂停所有该符号的调用。例如:
removeFromSuperview
,只要调用了removeFromSuperview
就·
会暂停程序执行
类的一个方法。例如:-[MyView1removeFromSuperview]
C 函数。例如:c_func
像以下这三种断点就是符号断点
进入编辑方式:选中断点导航面板中设置的符号断点,点击右键,选择 Edit Breakpoint
即可进入下图编辑面板
我们的程序常常会直接崩溃在main函数
当遇到这种问题时候我们就需要一个Exception Breakpoint
例如我这里出现了数组越界的问题,当我加上了这个断点之后会自动帮我定位到出现问题的数组位置
我们还可以在断点的action中添加po $arg1
,便可以打印出异常对象的信息
这里建议程序运行时始终执行这个断点,有利于节约我们的时间
一个自动布局约束错误断点,其可以帮你快速定位自动布局错误,但其并不常用,会在我们使用Masonry进行自动布局时用到。
当我们的控件之间有约束错误,这个断点会自动识别,并且通过查看堆栈我们可以看到具体是哪一个控件出了问题
在以上程序中笔者故意对_reply
控件进行了错误的约束,查看堆栈发现其自动帮我们找到了约束错误的控件
Xcode提供了强大的调试功能,当断点挂起时,就会进入调试界面
这是调试工具栏:
调试工具栏中有许多按钮:
例如当断点挂起之后,点击继续执行按钮可以继续执行
单步跳过按钮是单步执行,遇到方法与函数时不进入
单步进入按钮则是进入方法或者函数里, date = [self.homeModel pastDateForJson:numbersOfLoad];
这段代码中点击单步进入程序就会进入pastDateForJson
方法中,如果点击单步跳过则不会进入
单步跳出按钮在进入方法或函数后想跳回原来调用他的地方时使用
使用窗口显示按钮可以控制同时显示左右两个窗口(变量查看窗口与输出窗口),或者只显示其中一个窗口。输出窗口有三种选择——All Output、Debugger Output与Target Output
调试程序时可以在Debugger Output窗口中执行调试命令
Target Output窗口则显示一些输出以及报错信息
位于调试窗口左侧,用于查看变量与寄存器内容,与输出窗口相同,也有多种选项
同时右击变量还可以对变量进行多种操作
例如我们点击printf变量,便会在输出窗口出现如下输出
Xcode中有两种方式支持我们查看线程
一种是在跳转栏中选择线程下拉列表,选择某个线程后,Xcode会显示一个代码运行的栈
另一种方法就是点击毛毛虫,也可以显示线程与其堆栈
我们在上文用到的方法其实都可以用LLDB调试工具做到,这里笔者简单说几个常用的LLDB命令
expr命令:全称expression,可以在调试时动态修改变量的值,同时打印出结果。使用expr命令动态修改变量的值,可以在调试的时候覆盖一些异常路径,对调试异常处理的代码很有用。
bt命令可以查看线程的堆栈信息,该信息也可以在导航区的Debug Navigator看到;
bt:打印当前线程栈 bt all:打印所有线程栈