如何解决Xcode中的SIGABRT错误
一分钟,您的iOS应用程序可以在Xcode中正常运行,而下一分钟,它由于不可思议的SIGABRT错误而崩溃了。这是怎么回事!?
在本教程中,您将学习:
- 如何解决Xcode中的“ Signal SIGABRT”错误
- 如何在Xcode中使用某些调试工具
- SIGABRT代表什么,其原因是什么
- 找到SIGABRT根本原因的3种方法
准备好?我们走吧。
- “线程1:信号SIGABRT”是什么意思?
- 检查您的Outlets
- 检查堆栈跟踪
- 设置异常断点
- 进一步阅读
“线程1:信号SIGABRT”是什么意思?
错误SIGABRT代表“信号中止”。这是由iOS(操作系统)发送到正在运行的应用的信号,由于运行时错误,该信号将立即退出该应用。从本质上讲,这意味着您的应用已崩溃…
这是Xcode中的样子:
在屏幕截图中,您会看到一些东西:
- 在左侧,您可以看到应用崩溃时运行的线程列表。您会看到导致崩溃的线程是主线程或“线程1”。
- 在编辑器中,我们看到可怕的线程1:信号SIGABRT错误。突出显示了编辑器中的第12行,即类的定义
AppDelegate
。 - 在底部,您会看到有用的调试输出。在这种情况下,您将获得一个堆栈跟踪和有关不符合“键值编码兼容”的神秘错误消息。
SIGABRT错误的问题在于它过于笼统。Xcode基本上是在说:“看,您的应用程序崩溃了,这就是我们所知道的。” 在SIGABRT错误的大多数情况下,您几乎不了解导致错误的原因。
在继续之前,让我们讨论SIGABRT的一些误解和常见陷阱:
- SIGABRT错误通常与
AppDelegate
类声明无关,即使它在Xcode中突出显示了该行。该行被突出显示,因为它是您应用程序的第一行代码。AppDelegate
除非您绝对确定其中存在错误,否则不要浪费时间在课堂上。 - stacktrace是导致应用崩溃的函数调用列表。这并不意味着导致错误的代码行在stacktrace中的任何位置。有时是这样,但是在其他情况下,stacktrace只会导致代码阻塞在您自己代码中其他位置设置的值上。
- 不要盲目地盯着SIGABRT错误。有一个合理的,逻辑上的错误原因。这可能是您自己的代码中的错误,并且这没有什么错。应用不是魔术,没有人能吸引您,并且错误永远不会出乎意料。不要让自己感到沮丧,例如“昨天运行良好!” –总是如此,现在却没有!
现在我们已经建立了基准,让我们开始探讨SIGABRT的第一个原因。
检查您的Outlets
“信号SIGABRT”的常见原因是网点中有错别字或错误。这是发生了什么:
- 您在Interface Builder中创建了一个新的视图控制器,并使用一些UI元素(例如按钮和标签)对其进行了设置
- 您可以通过使用插座属性将这些UI元素连接至代码,这将在视图控制器的属性与Interface Builder中的UI元素之间建立连接
- 有一次您更改了初始插座属性的名称,并且您的应用因SIGABRT错误而开始崩溃
当您使用Interface Builder创建视图控制器时,您的应用程序运行时(大致而言),您的应用程序将使用XIB文件生成视图控制器的UI。此时,它将还将XIB的插座连接到视图控制器类的属性。
如果您更改了插座属性的名称,则您的应用程序将找不到它。因此,它将引发异常。导致SIGABRT错误的原因是未处理该异常。
这是Xcode中的样子:
看看发生了什么事?该属性被称为otherButton
,但插座仍被称为button。有一次我们更改了出口-因为新名称更好-并混淆了该应用程序,这使其崩溃。
在堆栈跟踪的顶部,我们还发现了另一个线索:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<...> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key button.
这意味着什么?该应用程序此时告诉我们,视图控制器不符合该键的键值编码button
。这意味着它无法button
在视图控制器上找到该属性。没错,因为我们已经对其进行了重命名。
iOS使用一种称为键值编码的机制来检查视图控制器具有的属性,因此它可以使用这些属性来引用其基于XIB创建的UI元素。
您现在如何解决该错误?您可以使用2种方法:
- 您将属性重命名为其原始名称
- 您在Interface Builder中删除插座连接,然后使用新的插座属性名称重新连接它
让我们继续!
小提示:正如一个变化@IBOutlet
可能会导致“线程1:信号SIGABRT”,所以错误地改变一个名称动作用,即@IBAction
,原因SIGABRT错误。
检查堆栈跟踪
在许多情况下,Xcode不会向您显示SIGABRT崩溃的任何有用的错误消息。发生这种情况时,了解一些调试命令很有用,例如bt
。
Xcode具有称为LLDB的集成调试环境。这是您的应用程序运行时在Xcode底部,控制台或调试输出区域中看到的内容。您经常在这里看到调试消息,但是您知道也可以使用它来输入命令吗?
下次您的应用崩溃时,请尝试输入help
LLDB。像这样:
您会看到许多LLDB命令直接对应于调试器可以执行的操作,例如设置断点,单步执行代码行以及检查运行时值。
一个命令特别有用。您可以键入bt
以查看当前的调用堆栈(也称为“ backtrace”或“ stacktrace”)。这是运行到当前崩溃的所有功能的列表。此跟踪通常包括导致错误的功能。
在这里,检查典型索引超出范围错误的堆栈跟踪。在下面的屏幕截图中,我们故意99
从仅包含4个项目的数组中获取索引,从而导致了该错误。当应用崩溃时,bt
可以告诉我们哪一行代码导致了错误。
您可以在堆栈跟踪中发现以下信息吗?
- 该违规代码是在第21行
ViewController.swift
,内部viewDidLoad()
功能 - 你甚至可以看到,我们所使用的标的“吸气”
Array
- 在崩溃之前,进行了大量与视图控制器相关的函数调用
根据获得的信息bt
,我们可以在代码中找到有问题的行并进行修复。在这种情况下,Xcode已经通过突出显示编辑器中的错误为我们提供了帮助。在某些情况下,您将不会遇到这种运气,因此使用该bt
命令可能会有所帮助。
最后一件事:您可以在运行时使用print
命令检查值。在上述情况下,键入print names
将产生以下输出:
([String]) $R0 = 4 values {[0] = "Ford"[1] = "Arthur"[2] = "Zaphod"[3] = "Trillian"
}
要打印复杂的对象,请使用po
。惊人的!
请记住,stacktrace是从外向内运行的。堆栈跟踪显示顶级函数调用的底部,往上走的堆越高,越深的电话去在。最新的,最新的,最深层的调用位于堆栈的顶部。
设置异常断点
您可以使用断点在特定行停止执行代码。此时,您可以检查值并逐步执行功能。
一个异常断点时的异常在你的代码出现被触发。您无需指示调试器在哪一行上触发断点,而是指示调试器暂停代码执行以防出现异常。
发生异常时,异常断点对于检查代码很有用。您可以看到引发异常的代码行,并且可以在此时检查代码中的值。有些异常是由应用程序的错误或无效状态引起的,因此异常断点对于查找和修复这些错误很有用。
这是设置异常断点的方法:
- 使用左侧的标签,转到Xcode中的Breakpoint导航器
- 单击左下角的
+
按钮,然后选择“异常断点” - 保持默认设置不变(尽管它们有助于自定义)
- 运行你的代码
引发异常时,应用程序的执行将停止。现在,您可以使用调试器检查值,单步执行代码并使用LLDB命令。如果可能,Xcode将带您到引起异常的代码行。
请记住,异常并不一定会使您的应用程序崩溃!因此,每当启用异常断点并发生异常时,您的应用程序便会暂停。带有断点的代码暂停与应用程序崩溃不同,因此请不要让它造成混淆。
例如,异常断点将由不满足的约束异常触发,但这不会使您的应用程序崩溃。使用异常断点收集SIGABRT崩溃的其他信息,然后在解决该错误后将其禁用(直到再次需要它)。
如何解决Xcode中的SIGABRT错误相关推荐
- 成功解决Python中导出图片出现错误SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position
成功解决Python中导出图片出现错误SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position ...
- Xcode中常见的错误,警告和解决方法
1.Info.plist Utility Error: "Info.plist couldn't be opened because there is no such file" ...
- 解决AutoCAD2002中的许可证错误和取消今日知道
一. 打开AutoCAD2002时,经常弹出"今日知道",可用如下方法关闭该对话框,以便下次打开时不弹出该对话框. 在cad中,右击cad绘图区(也就是黑色背景)-->[选 ...
- 错误 找不到或无法加载主类mysql_解决Eclipse中“诡异”的错误:找不到或无法加载主类...
记录下来遇到的(问题,解决方法),是更有效的解决问题的方式.(原谅我领悟的太晚与懒,从此用更有意义的方法,做一个更有意义的人) 因为遇到了多次,参考同一个方法,原文连接:https://blog.cs ...
- 错误 找不到或无法加载主类 mysql_解决Eclipse中“诡异”的错误:找不到或无法加载主类...
前面提到的删掉了所有的 .class 文件后点击运行报错主要也是这个原因.删除 .class 文件后,在 .java 文件没有变化的时候是不会被重新编译的,那么 JVM 在运行 .class 文件时就 ...
- 解决VMbox中软连接创建错误的问题
在使用VMBox架设的ubuntu系统下创建软链接:ln -s test 提示错误:"failed to create symbolic link './test': Read-only f ...
- 解决Xcode中iOS模拟器无法上网的问题!
情况一: 无法与服务器建立安全的连接; 情况二: 此连接非私人连接 出现以上两种情况的解决办法: 进入Mac的网络偏好设置-->高级-->代理-->把网页代理和安全网页代理前面的勾去 ...
- 解决 OneNote 中的 0xE000005E错误
可能的原因如下 1.自行安装了其他版本的ONENOTE 例如OneNote2013 可能需要卸载掉,因为WIN10本身带有该应用. PS 如果想打开自行安装的OnerNote2013的话,也可能因为w ...
- 会声会影V2021新补丁及安装教程中出现的错误解决方法
拿会声会影2018安装教程分享,详见文章末尾最新会声会影版. ps:部分国内杀毒软件未收录会声会影2018新补丁,建议在安装软件前,先检查是否有杀毒软件运行,如有运行,请关闭杀毒软件. 1.下载完成后 ...
最新文章
- 实验四-常用图像增强方法
- php改密后joomla无法登陆,恢复丢失的Joomla密码的最常用方法
- 重新开始我的园子生活了
- 容器中Java RAM的使用:不会丢失内存的5大技巧
- 15必须阅读Java 8教程
- 通过mysql实现leader election
- 测试用例-写测试用例时怎么入手
- python3 闭包
- Configuration property name ‘fdfs.thumbImage‘ is not valid---springcloud工作笔记163
- atitit.提升开发效率---MDA 软件开发方式的革命(5)----列表查询建模
- 学习RedHat7第一课
- matlab 固态 机械_忆捷固态硬盘怎么样(2款忆捷固态硬盘测评)
- Pr:视频防抖效果控件
- java 如何防止重复提交_干货实战~Java如何防止接口重复提交
- 【Java】 Java中接口是什么,以及接口的使用和理解
- 99乘法表java取偶数,99乘法表(乘法口诀朗诵mp3)
- 状态空间描述到传递函数
- SVN客户端安装和使用
- PANDA 下载及安装
- Linux中if语句用法总结
热门文章
- STM32F103C8T6 操作矩阵键盘
- 【Proe】三维模型转二维CAD图
- EFS加密文件系统应用心得
- JAVA中级二 输入输出流,常见文件操作
- python 程序运行时间长,python查看程序运行时间的方法
- 笔记本合上盖子怎么不休眠了?
- Python 安装包环境小问题:WARNING: The repository located at pypi.douban.com is not a trusted or secure host a
- Enovia Overview
- 部署ServletContext的时候报错 Class com.xxxxx.ContextServlet is not a Servlet
- 重庆崽儿,啷个能不回重庆撒!