【问题标题】:Diagnosing EXC_BAD_INSTRUCTION in Swift standard library在 Swift 标准库中诊断 EXC_BAD_INSTRUCTION
【发布时间】:2014-06-12 16:44:53
【问题描述】:

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

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

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

【问题讨论】:

    标签: swift


    【解决方案1】:

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

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

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

    • 有时调试器会因 Swift 系统库中的运行时错误而停止。例如,当您将闭包传递给 filtermapreduce 等收集方法时,就会发生这种情况。然后在这些库函数的调用站点发生运行时错误,但定义可能在您定义函数/闭包的代码的不同部分中。在那里寻找可能在运行时为 nil 的隐式解包选项。

    要防范此类错误,请注意,即使 Swift 编译器不会强制您处理从 Cocoa 返回的潜在 nil 值,您也应该使用 optional bindingoptional chainingoptional downcasting,无论 Objective-C 领域的返回值可能是 nil

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

    【讨论】:

    • 在 Beta 3 中,您现在会收到一条控制台消息,其效果是“一个隐式展开的可选项有一个 nil 值”。
    • 我只是遇到了这个与展开选项或引用无关的错误 - 一切都是结构类型,如 as! 或任何东西。原来是因为数学溢出
    【解决方案2】:

    我发现(几个小时后)这个错误可能出现在错误的行上。

    例如

    如您所见,应用程序在我正在检查 nil 的地方崩溃,但随后“继续”通过,因为它会打印语句。然后它会“倒退”并崩溃。

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

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

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

    正如评论中提到的,有编译器优化。这是解决问题的链接(并找到崩溃的路径原因)

    xcode 6.1 how to disable optimization (Swift)

    【讨论】:

    • 从您的描述看来,您的崩溃似乎是在优化构建中发生的,我猜?如果是这样,编译器很可能在优化过程中做了一些代码重新排序,所以……;-)
    • 是的,关闭它会导致实际需要补救的线路
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-25
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      相关资源
      最近更新 更多