如何解决Xcode中的SIGABRT错误

一分钟,您的iOS应用程序可以在Xcode中正常运行,而下一分钟,它由于不可思议的SIGABRT错误而崩溃了。这是怎么回事!?在本教程中,您将学习:如何解决Xcode中的“SignalSIGABRT”错误 如何在Xcode中使用某些调试工具 SIGABRT代表什么,其原因是什么 找到SIGABRT根本原因的3种方法准备好?我们走吧。“线程1:信号SIGABRT”是什么意思? 检查您的Outlets 检查堆栈跟踪 设置异常断点 进一步阅读“线程1:信号SIGABRT”是什..

大家好,又见面了,我是你们的朋友全栈君。

如何解决Xcode中的SIGABRT错误

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

在本教程中,您将学习:

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

准备好?我们走吧。

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

“线程1:信号SIGABRT”是什么意思?

错误SIGABRT代表“信号中止”。这是由iOS(操作系统)发送到正在运行的应用的信号,由于运行时错误,该信号将立即退出该应用。从本质上讲,这意味着您的应用已崩溃…

这是Xcode中的样子:

Xcode中SIGABRT的示例

在屏幕截图中,您会看到一些东西:

  • 在左侧,您可以看到应用崩溃时运行的线程列表。您会看到导致崩溃的线程主线程或“线程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中的样子:

插座的SIGABRT错误

看看发生了什么事?该属性被称为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。像这样:

在Xcode控制台中调试SIGABRT

您会看到许多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崩溃的其他信息,然后在解决该错误后将其禁用(直到再次需要它)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/127146.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 知己知彼:一篇来自前端同学对后端接口的吐槽!

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:李熠 juejin.im/post/6844903861841313806 前言 去年的某个时候就想写一篇关于…

  • http接口取参方式 – getParameter 和 getParameterValues[通俗易懂]

    http接口取参方式 – getParameter 和 getParameterValues[通俗易懂]前言:最近写http接口时,有了很多关于接口取参方式的疑问,大家都知道Servlet常用的取参方式有getParameter、getParameterValues、getInputStream(读流形式)。SpringMvc常用的有封装好的@RequestParam,RequestBody。这些取参方式都有什么特点,我都写了测试接口,利用postman做了测试…

  • JS后退一页, JS返回上一页, JS返回下一页代码[通俗易懂]

    JS后退一页, JS返回上一页, JS返回下一页代码[通俗易懂]Javascript返回上一页:1.history.go(-1),返回两个页面:history.go(-2);2.history.back().3.window.history.forward()返回下一页4.window.history.go(返回第几页,也可以使用访问过的URL)例:&lt;ahref="javascript:history.go(-1);"…

  • java编程app_如何用java开发app

    java编程app_如何用java开发app前言本人是底层211本科,刚毕业,⽆科研经历,但是有些项⽬经历。在国内监控行业某头部企业做过一段时间的实习。想着投下字节,可以积累⼀下⾯试经验和为金九银十面招做准备。投了简历之后,过了一段时间,HR就打电话跟我约时间,说明一下,我投的是北京office。以下就是一个面试的全部过程,分享出来给感兴趣的朋友们一看。阿里的人才画像其实最近两年自己一直在做面试官,也面试过很多优秀的人,心里大概有一个标准,知道什么样的人才是我们想要的人。但是这个标准我一直都没有仔细的去思考过,刚好最近有时间

  • iscsiadm command

    iscsiadm commanddiscoverytargets:# iscsiadm–modediscovery–typesendtargets–portal192.168.1.10viewmoreinformationaboutyouriSCSI Targetwiththefollowingcommand:#iscsiadm-mnode-Tiqn.2011-07.com.exa

  • 26Region_tarim logai toplam

    26Region_tarim logai toplam给出 n 个点的一棵树,多次询问两点之间的最短距离。注意:边是无向的。所有节点的编号是 1,2,…,n。输入格式第一行为两个整数 n 和 m。n 表示点数,m 表示询问次数;下来 n−1 行,每行三个整数 x,y,k,表示点 x 和点 y 之间存在一条边长度为 k;再接下来 m 行,每行两个整数 x,y,表示询问点 x 到点 y 的最短距离。树中结点编号从 1 到 n。输出格式共 m 行,对于每次询问,输出一行询问结果。数据范围2≤n≤104,1≤m≤2×104,0<k≤1

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号