【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…

Gradio-Lite: 完全在浏览器里运行的无服务器 Gradio

Gradio 是一个经常用于创建交互式机器学习应用的 Python 库。在以前按照传统方法,如果想对外分享 Gradio 应用,就需要依赖服务器设备和相关资源,而这对于自己部署的开发人员来说并不友好。 欢迎 Gradio-lite ( gradio/lite ): 一个通过 Pyodi…

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

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

阅读软件OmniReader Pro mac功能特色

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

05_通信案例

群聊案例 服务端 package login;import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List;public class Server {public static List<Socket> onlineSockets new ArrayList<>(); // 用于…

单细胞个性化细胞注释

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

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

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

测试面经1203

测试面经1203 4. 什么是黑盒测试5. 除了黑盒测试还有其他的测试吗&#xff1f;6. 灰盒测试是谁来进行的&#xff1f;7. 使用Excel表格设计测试用例&#xff0c;使用Excel表格有什么优势呢&#xff1f;Xmind优势Xmind劣势 12. 测试需求怎么分析&#xff1f;13. 黑盒测试都有哪些…

MATLAB 自抗扰控制 - Active Disturbance Rejection Control

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

利用vue3SeamlessScroll简单实现列表的无限循环滚动

1、安装 yarn add vue3-seamless-scroll2、导入及基本使用 <!--组件.vue--> <script setup>import { Vue3SeamlessScroll } from vue3-seamless-scroll;import {ref} from vue//vue3导入组件是不需要用component注册的//导入完成后如果项目本身是在运行的记得重新…

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

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

【Spring Boot 源码学习】ApplicationContextInitializer 详解

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

ubuntu18编译Android8的Failed to contact Jack server问题

环境 ubuntu18.04 Android8.1.0 步骤 安装环境 apt install git-core apt install gnupg apt install flex apt install bison apt install gperf apt install build-essential apt install curl apt install libc6-dev apt install libssl-dev apt install libncurses5-dev:…

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

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

使用String.valueOf()的坑

说明&#xff1a;记录一次使用String.valueOf()的坑&#xff0c;以下是一段有问题的代码&#xff1a; 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.文件夹 …

react-native实践日记--3.ui-kitten中的button设置字体颜色无效

react-native搭建App&#xff0c;UI框架采用ui-kitten&#xff0c;遇到其中的button组件设置字体颜色无效&#xff0c;一直都是白色 设置button的style和textStyle更改字体颜色&#xff0c;一直都是不起作用 <Buttonstyle{[styles.dateBtn,{flexDirection: row-reverse,fle…

Vue经典面试题源码级分析【一】

01-Vue组件通信方式有哪些 父子组件 &#xff1a; props/ emit/ $parent / ref / $attrs $attrs: https://cn.vuejs.org/api/component-instance.html#attrs 兄弟组件&#xff1a;$parent / $root / eventbus / vuex跨层级关系&#xff1a;eventbus / vuex / provide inject 父…

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

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

Effective Java解读

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