在Swift标准库中诊断EXC_BAD_INSTRUCTION

时间:2014-06-12 16:44:53

标签: swift

在iOS模拟器中运行的My Swift应用程序正在调试器中停止,运行时错误为EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, sub code=0x0)

根据WWDC 2014 Session 409,这通常是由于断言失败。

在Xcode 6的当前开发Beta版本中,调试器的堆栈跟踪和上述错误无法提供足够的信息来查看问题所在。我如何找出问题所在?

3 个答案:

答案 0 :(得分:5)

这个错误的最常见来源(在撰写本文时:Xcode 6 Beta 1)似乎是一些隐式展开的可选属性或变量 nil

为方便起见,大多数Objective-C API都与implicitly unwrapped optionals桥接到Swift。它们在类型声明后面用感叹号表示:AnyObject[]!

  • 如果调试器在您的代码中停止,请仔细检查该行并查找可能在nil处隐式展开的选项。

  • 有时调试器会在Swift系统库深处停止运行时错误。例如,当您将闭包传递给诸如filtermapreduce等的集合方法时会发生这种情况。然后,运行时错误发生在这些库函数的调用位置,但定义可能位于代码的不同部分,您定义了函数/闭包。查看那些在运行时可能为零的隐式解包的选项。

要再次警惕这些错误,请注意,即使Swift编译器不会强制您处理从Cocoa返回的潜在nil值,您也应该使用optional bindingoptional chaining 或者optional downcasting,只要Objective-C土地的返回值可能是nil

让我们希望未来版本的Swift编译器能够为这种常见类型的问题开始发出更多有用的诊断消息和错误!

答案 1 :(得分:3)

我发现(在数小时后)此错误可能出现在错误的行上。

例如

enter image description here

正如你所看到的那样,应用程序正在崩溃,我正在检查nil,但是然后继续'因为它打印语句。然后它会倒退#39;和崩溃。

我得出的结论是,在XCode(7)中存在源映射错误,其中nil变量是未包装的。在这种情况下,我有一个变量(在我的代码中更远的地方),它是零并且被打开。

问题当然是编译器没有标记实际变量nil,它完全标记了其他内容。

因此,如果您遇到这个讨厌的错误,请浏览所有可能为nil的变量并检查它们是否展开。你可能打开一个零,它只是编译器说的那个。

如评论中所述,存在编译器优化。这是一个解决问题的链接(并找到崩溃的路由原因)

xcode 6.1 how to disable optimization (Swift)

答案 2 :(得分:0)

我和Palimondo有同样的问题。幸运的是,这只是确保我提前初始化项目的问题。在我的代码中,我调用的函数是将图像放在UIImageViews中并从数组中传入一个元素。我还没有用UIImageViews加载我的数组,因此当代码运行时,它会说我传入了一个不存在的数组元素。一旦我确定在程序开始时加载我的数组,错误就消失了。