【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.mzph.cn/news/192914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Collection的其他相关知识

前置知识:可变参数 就是一种特殊参数,定义在方法 构造器的形参列表里,格式是:数据类型...参数名称; 可变参数的特点和好处 特点:可以不传数据给它;可以传一个或者同时传多个数据给它&#xff…

Vue3+nuxt+ts项目引入高德地图API实现步骤

看了好多相关的文章都没有完全贴合选用Vue3nuxtts框架的,也不太靠谱,只好自己踩坑实现了 首先去高德开放平台用自己的账号申请一个key,位置如下,申请好后保存好生成的key 我们使用vuemap/vue-amap,一个高德地图2.0版本…

阅读软件OmniReader Pro mac功能特色

OmniReader Pro mac是一款文字识别和阅读软件,它可以将印刷体和手写体的文字转换为数字文本,并将其朗读出来。该软件适用于视力受损、阅读困难、语言障碍等用户,可以帮助他们更加轻松地获取信息和阅读文本。 OmniReader Pro具有简洁直观的用户…

单细胞个性化细胞注释

关于单细胞中级的课程内容,前面已经有了三次直播。欢迎回看~ 单细胞直播一理解seurat数据结构与pbmc处理流程 单细胞直播二从GSE104154中理解seurat结构 单细胞直播三seurat数据结构与数据可视化 本期主要内容 本期指哪打哪,自己选定细胞&…

java的四种内部类,从0讲清楚

什么是内部类? 为什么要学习内部类? 可以发现,发动机虽然跟汽车相关,但发动机不像车龄或颜色一样,只用一个变量就可以描述,而是要有发动机品牌,发动机年限,多个变量描述发动机。那么…

MATLAB 自抗扰控制 - Active Disturbance Rejection Control

系列文章目录 MATLAB 模型参考自适应控制 - Model Reference Adaptive Control 文章目录 系列文章目录前言一、控制器结构1.1 一阶逼近1.2 二阶逼近 二、指定控制器参数参考 前言 自抗扰控制 (ADRC) 是一种无模型控制方法,适用于为具有未知动态特性以及内部和外部…

Azure Machine Learning - 使用 Azure SDK 进行全文搜索

了解如何使用 Azure SDK 中的 Azure.Search.Documents 客户端库创建、加载和查询使用示例数据的搜索索引,实现全文搜索。 全文搜索使用 Apache Lucene 进行索引和查询,使用 BM25 排名算法对结果进行评分。 关注TechLead,分享AI全维度知识。作…

【Spring Boot 源码学习】ApplicationContextInitializer 详解

Spring Boot 源码学习系列 ApplicationContextInitializer 详解 引言往期内容主要内容1. 初识 ApplicationContextInitializer2. 加载 ApplicationContextInitializer3. ApplicationContextInitializer 的初始化 总结 引言 书接前文《初识 SpringApplication》,我们…

【傻瓜级JS-DLL-WINCC-PLC交互】6.​向PLC里面装载数据变量

思路 JS-DLL-WINCC-PLC之间进行交互,思路,先用Visual Studio创建一个C#的DLL控件,然后这个控件里面嵌入浏览器组件,实现JS与DLL通信,然后DLL放入到WINCC里面的图形编辑器中,实现DLL与WINCC的通信。然后PLC与…

使用String.valueOf()的坑

说明:记录一次使用String.valueOf()的坑,以下是一段有问题的代码: String count String.valueOf(listData.get(0).get(0).get("count");if (StringUtils.isBlank(count) || "0".equals(count)) {result.setResult(page)…

【bat】批处理脚本大全

目录 1.概述 2.变量 3.运算符 3.2.重定向运算符 3.3.多命名运算符 3.4.管道运算符 4.命令 4.1.基本命令 4.2.参数传递 4.3.查看脚本内容 4.4.注释 4.5.日期和时间 4.6.启动脚本 4.7.调用其他bat 4.8.任务管理 4.8.1.任务列表查看 4.8.2.任务终止 4.9.文件夹 …

美容院管理系统服务预约会员小程序效果如何

美容院在美业场景中需求度较高,尤其女性爱美悦己消费逐年增加,如清洁焕肤、祛皱抗衰、激光脱毛等美容项目都有不少需求者。 互联网深入美业行业多年,传统线下经营模式已经很难满足当今客户消费流程,如品牌寻找、服务预约、到店、…

Effective Java解读

Effective Java 第一章 引言第二章 创建和销毁对象第1条:用静态工厂方法代替构造器第2条:遇到多个构造器参数时要考虑使用构建器第3条:用私有构造器或者枚举类型强化Singletion属性第4条:通过私有构造器强化不可实例化的能力第5条…

pandas基础操作2

数据读取 我们想要使用 Pandas 来分析数据,那么首先需要读取数据。大多数情况下,数据都来源于外部的数据文件或者数据库。Pandas 提供了一系列的方法来读取外部数据,非常全面。下面,我们以最常用的 CSV 数据文件为例进行介绍。 …

【LeetCode:1423. 可获得的最大点数 | 滑动窗口】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

微前端实战:打造高效、灵活的前端应用架构

文章目录 一、微前端简介二、微前端的优势1. 高度模块化2. 独立部署3. 易于扩展4. 技术栈无关5. 独立升级 三、微前端的原理四、微前端案例思路《微前端实战》编辑推荐内容简介作者简介目录前言/序言 随着互联网行业的快速发展,前端应用的规模和复杂度也在不断增加。…

windows11 调整鼠标灵敏度方法

首先 我们打开电脑设置 或者在 此电脑/此计算机/我的电脑 右击选择属性 然后 有的电脑 左侧菜单中 直接就有 设备 然后在设备中直接就可以找到 鼠标 选项 调整光标速度即可 如果操作系统和我的一样 可以直接搜索鼠标 然后 选择 鼠标设置 然后 调整上面的鼠标指针速度即可

论文解读--Robust lane detection and tracking with Ransac and Kalman filter

使用随机采样一致性和卡尔曼滤波的鲁棒的车道线跟踪 摘要 在之前的一篇论文中,我们描述了一种使用霍夫变换和迭代匹配滤波器的简单的车道检测方法[1]。本文扩展了这项工作,通过结合逆透视映射来创建道路的鸟瞰视图,应用随机样本共识来帮助消…

网络编程之套接字

端口 && IP 在学习套接字编程之前,我们必须了解一下前缀知识。首先是IP和端口的作用。 在这之前,我们要明白一件事。那就是把数据从一台主机发送到另一台主机,是目的吗???当然不是!&a…

qt-C++笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解

qt-C笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解 文章目录 qt-C笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解1.示例运行2.event->pos();详解3.event->pos()的坐标系原点4.Qt中的坐标系详解5.QMainWindow::mousePressEvent(event);详解 1.示例运行 截图时鼠…