一分钟,您的iOS应用程序可以在Xcode中正常运行,而下一分钟,它由于不可思议的SIGABRT错误而崩溃了。这是怎么回事!?

在本教程中,您将学习:

  • 如何解决Xcode中的“ Signal SIGABRT”错误
  • 如何在Xcode中使用某些调试工具
  • SIGABRT代表什么,其原因是什么
  • 找到SIGABRT根本原因的3种方法

准备好?我们走吧。

  1. “线程1:信号SIGABRT”是什么意思?
  2. 检查您的Outlets
  3. 检查堆栈跟踪
  4. 设置异常断点
  5. 进一步阅读

“线程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种方法:

  1. 您将属性重命名为其原始名称
  2. 您在Interface Builder中删除插座连接,然后使用新的插座属性名称重新连接它

让我们继续!

小提示:正如一个变化@IBOutlet可能会导致“线程1:信号SIGABRT”,所以错误地改变一个名称动作用,即@IBAction,原因SIGABRT错误。

检查堆栈跟踪

在许多情况下,Xcode不会向您显示SIGABRT崩溃的任何有用的错误消息。发生这种情况时,了解一些调试命令很有用,例如bt

Xcode具有称为LLDB的集成调试环境。这是您的应用程序运行时在Xcode底部,控制台或调试输出区域中看到的内容。您经常在这里看到调试消息,但是您知道也可以使用它来输入命令吗?

下次您的应用崩溃时,请尝试输入helpLLDB。像这样:

您会看到许多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是从外向内运行。堆栈跟踪显示顶级函数调用的底部,往上走的堆越高,越深的电话去。最新的,最新的,最深层的调用位于堆栈的顶部。

设置异常断点

您可以使用断点在特定行停止执行代码。此时,您可以检查值并逐步执行功能。

一个异常断点时的异常在你的代码出现被触发。您无需指示调试器在哪一行上触发断点,而是指示调试器暂停代码执行以防出现异常。

发生异常时,异常断点对于检查代码很有用。您可以看到引发异常的代码行,并且可以在此时检查代码中的值。有些异常是由应用程序的错误或无效状态引起的,因此异常断点对于查找和修复这些错误很有用。

这是设置异常断点的方法:

  1. 使用左侧的标签,转到Xcode中的Breakpoint导航器
  2. 单击左下角的+按钮,然后选择“异常断点”
  3. 保持默认设置不变(尽管它们有助于自定义)
  4. 运行你的代码

引发异常时,应用程序的执行将停止。现在,您可以使用调试器检查值,单步执行代码并使用LLDB命令。如果可能,Xcode将带您到引起异常的代码行。

请记住,异常并不一定会使您的应用程序崩溃!因此,每当启用异常断点并发生异常时,您的应用程序便会暂停。带有断点的代码暂停与应用程序崩溃不同,因此请不要让它造成混淆。

例如,异常断点将由不满足的约束异常触发,但这不会使您的应用程序崩溃。使用异常断点收集SIGABRT崩溃的其他信息,然后在解决该错误后将其禁用(直到再次需要它)。

如何解决Xcode中的SIGABRT错误相关推荐

  1. 成功解决Python中导出图片出现错误SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position

    成功解决Python中导出图片出现错误SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position ...

  2. Xcode中常见的错误,警告和解决方法

    1.Info.plist Utility Error: "Info.plist couldn't be opened because there is no such file" ...

  3. 解决AutoCAD2002中的许可证错误和取消今日知道

    一.  打开AutoCAD2002时,经常弹出"今日知道",可用如下方法关闭该对话框,以便下次打开时不弹出该对话框. 在cad中,右击cad绘图区(也就是黑色背景)-->[选 ...

  4. 错误 找不到或无法加载主类mysql_解决Eclipse中“诡异”的错误:找不到或无法加载主类...

    记录下来遇到的(问题,解决方法),是更有效的解决问题的方式.(原谅我领悟的太晚与懒,从此用更有意义的方法,做一个更有意义的人) 因为遇到了多次,参考同一个方法,原文连接:https://blog.cs ...

  5. 错误 找不到或无法加载主类 mysql_解决Eclipse中“诡异”的错误:找不到或无法加载主类...

    前面提到的删掉了所有的 .class 文件后点击运行报错主要也是这个原因.删除 .class 文件后,在 .java 文件没有变化的时候是不会被重新编译的,那么 JVM 在运行 .class 文件时就 ...

  6. 解决VMbox中软连接创建错误的问题

    在使用VMBox架设的ubuntu系统下创建软链接:ln -s test 提示错误:"failed to create symbolic link './test': Read-only f ...

  7. 解决Xcode中iOS模拟器无法上网的问题!

    情况一: 无法与服务器建立安全的连接; 情况二: 此连接非私人连接 出现以上两种情况的解决办法: 进入Mac的网络偏好设置-->高级-->代理-->把网页代理和安全网页代理前面的勾去 ...

  8. 解决 OneNote 中的 0xE000005E错误

    可能的原因如下 1.自行安装了其他版本的ONENOTE 例如OneNote2013 可能需要卸载掉,因为WIN10本身带有该应用. PS 如果想打开自行安装的OnerNote2013的话,也可能因为w ...

  9. 会声会影V2021新补丁及安装教程中出现的错误解决方法

    拿会声会影2018安装教程分享,详见文章末尾最新会声会影版. ps:部分国内杀毒软件未收录会声会影2018新补丁,建议在安装软件前,先检查是否有杀毒软件运行,如有运行,请关闭杀毒软件. 1.下载完成后 ...

最新文章

  1. 实验四-常用图像增强方法
  2. php改密后joomla无法登陆,恢复丢失的Joomla密码的最常用方法
  3. 重新开始我的园子生活了
  4. 容器中Java RAM的使用:不会丢失内存的5大技巧
  5. 15必须阅读Java 8教程
  6. 通过mysql实现leader election
  7. 测试用例-写测试用例时怎么入手
  8. python3 闭包
  9. Configuration property name ‘fdfs.thumbImage‘ is not valid---springcloud工作笔记163
  10. atitit.提升开发效率---MDA 软件开发方式的革命(5)----列表查询建模
  11. 学习RedHat7第一课
  12. matlab 固态 机械_忆捷固态硬盘怎么样(2款忆捷固态硬盘测评)
  13. Pr:视频防抖效果控件
  14. java 如何防止重复提交_干货实战~Java如何防止接口重复提交
  15. 【Java】 Java中接口是什么,以及接口的使用和理解
  16. 99乘法表java取偶数,99乘法表(乘法口诀朗诵mp3)
  17. 状态空间描述到传递函数
  18. SVN客户端安装和使用
  19. PANDA 下载及安装
  20. Linux中if语句用法总结

热门文章

  1. STM32F103C8T6 操作矩阵键盘
  2. 【Proe】三维模型转二维CAD图
  3. EFS加密文件系统应用心得
  4. JAVA中级二 输入输出流,常见文件操作
  5. python 程序运行时间长,python查看程序运行时间的方法
  6. 笔记本合上盖子怎么不休眠了?
  7. Python 安装包环境小问题:WARNING: The repository located at pypi.douban.com is not a trusted or secure host a
  8. Enovia Overview
  9. 部署ServletContext的时候报错 Class com.xxxxx.ContextServlet is not a Servlet
  10. 重庆崽儿,啷个能不回重庆撒!