【iOS】Bug调试

news/2024/7/20 20:35:50 标签: 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为我们在我们编译时或是编译后会将问题以红色感叹号报告给我们,这里不再赘述。
在这里插入图片描述

二、设置与查看断点

编写代码时常常会出现我们始料未及的结果,为了找出原因,我们可以用断点来帮助我们,笔者接下来主要介绍三种类型的断点
在这里插入图片描述

1.文件行断点设置

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

当我们右击断点时,我们可以选择Edit Breakpoint,他的意思是断点编辑对话框,在其中我们可以为断点设置触发条件与忽略次数,并添加动作
在这里插入图片描述

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


2.符号断点设置

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

在这里插入图片描述
打开“+”号面板我们可以看到所有的全局断点在这里插入图片描述

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

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

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

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

3.Exception Breakpoint

我们的程序常常会直接崩溃在main函数
在这里插入图片描述
当遇到这种问题时候我们就需要一个Exception Breakpoint

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

4.Constraint Error Breakpoint

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


三、调试工具

Xcode提供了强大的调试功能,当断点挂起时,就会进入调试界面
在这里插入图片描述

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

四、输出窗口

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

五、变量查看窗口

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

在这里插入图片描述
同时右击变量还可以对变量进行多种操作
在这里插入图片描述
例如我们点击printf变量,便会在输出窗口出现如下输出
在这里插入图片描述

六、查看线程

Xcode中有两种方式支持我们查看线程
一种是在跳转栏中选择线程下拉列表,选择某个线程后,Xcode会显示一个代码运行的栈
在这里插入图片描述
另一种方法就是点击毛毛虫,也可以显示线程与其堆栈
在这里插入图片描述

七、LLDB调试工具

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

1.p,po命令

p命令:查看基本数据类型的值
po命令:查看oc对象
在这里插入图片描述
在这里插入图片描述

2.expr命令

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

3.bt命令

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

在学习多线程的时候可能会用到
在这里插入图片描述

还有一些更多的方便命令我们可以通过在lldb中打入help进行学习
在这里插入图片描述


http://www.niftyadmin.cn/n/5236863.html

相关文章

广州招聘网哪个平台比较好

广州吉鹿力招聘网是一个以中高端职位为主的招聘平台,也是广州招聘网中的新秀。提供了大量的高薪职位,包括金融、IT、管理等,广州吉鹿力招聘网还有一系列的职业规划服务,帮助求职者更好地发展自己的职业生涯。 首先打开吉鹿力招聘…

监听pinia里面数据的变化实现数据变化的时候刷新

实现思路 获取pinia实例并且使用watch进行监听旧数据和新数据 当发生改变的时候修改isshow属性&#xff0c;使用nexttick 把要刷新的组件绑定v-if”isshow“属性 代码 <groupsitem v-if"isshow" style"width: 40vw;" />import { selectedStoreHook…

Django 中的 HMAC 请求签名校验与 Vue.js 的完美协作

在 Web 应用的开发过程中,确保数据传输的安全性和完整性是一个不容忽视的问题。使用 HMAC(Hash-based Message Authentication Code)算法对请求内容进行签名校验,是一种常见且有效的安全策略。本文将详细介绍如何在 Django 后端实现 HMAC 签名校验,并展示如何在前端 Vue.j…

IEEE 机器人最优控制开源库 Model-based Optimization for Robotics

系列文章目录 文章目录 系列文章目录前言一、开源的库和工具箱1.1 ACADO1.2 CasADi1.3 Control Toolbox1.4 Crocoddyl1.5 Ipopt1.6 Manopt1.7 LexLS1.8 NLOpt1.9 qpOASES1.10 qpSWIFT1.11 Roboptim 二、其他库和工具箱2.1 MUSCOD2.2 OCPID-DAE12.3 SNOPT 前言 机器人&#xff…

自然语言处理:电脑如何理解我们的语言?

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​ 文章目录 ​编辑 常见方法 1.基于词典的方法 2.基于计数的方法 基于推理的方法 Bert input_ids attention_mask token_type_ids 结语 在广…

阿里云ACE认证含金量有多高?2023年海南E类人才认证政策告诉你答案!

2023年海南省高层次人才享受什么待遇&#xff1f;海南高层次人才住房补贴多少钱&#xff1f;海南高层次E类人才待遇有哪些&#xff1f;什么是海南高层次E类人才&#xff1f;E类人才怎么申请&#xff1f;这篇文章给大家详细介绍一下。 1.E类人才在海南有什么好处&#xff1f; …

深度学习数据集的划分(加载kaggle的dog数据,多gpu训练加载参数)待更新

待更新 把dog-breed-identification.zip 文件放到data文件目录下&#xff1a; 该文件解压之后得到如下&#xff1a; 遍历train中的所有文件&#xff0c;train_file.split(‘.’)[0]是根据.划分这个文件名&#xff0c;得到前缀和后缀&#xff0c;下标为0的是去掉后缀的文件名…

爬虫伦理与法律:确保数据采集合法性与伦理性

写在开头 在当今信息时代&#xff0c;数据采集作为核心活动之一&#xff0c;爬虫技术的广泛应用对社会和商业带来了深远影响。然而&#xff0c;随着数据收集的扩大和深入&#xff0c;我们必须认真思考与爬虫活动相关的伦理和法律问题。本文将深入探讨数据采集过程中的伦理考量…