构建时Swift编译器分段错误

时间:2014-06-14 17:50:26

标签: swift

在我的height文件中向UIView添加(方便的)计算UIViewExtension.swift属性会导致Swift编译器出现段错误......这里可能出现什么问题?

0  swift                    0x00000001061e5608 llvm::sys::PrintStackTrace(__sFILE*) + 40
1  swift                    0x00000001061e5af4 SignalHandler(int) + 452
2  libsystem_platform.dylib 0x00007fff894da5aa _sigtramp + 26
3  libsystem_platform.dylib 0xb03939841e997c88 _sigtramp + 2504775416
4  swift                    0x00000001064c8bb9 swift::NominalTypeDecl::getMembers(bool) const + 41
5  swift                    0x00000001055efab9 swift::irgen::ClassMetadataLayout<(anonymous namespace)::FindClassMethodIndex>::addClassMembers(swift::ClassDecl*) + 329
6  swift                    0x00000001055e97b2 swift::irgen::emitVirtualMethodValue(swift::irgen::IRGenFunction&, llvm::Value*, swift::SILType, swift::SILDeclRef, swift::CanTypeWrapper<swift::SILFunctionType>, swift::ResilienceExpansion) + 434
7  swift                    0x00000001056550d3 swift::SILVisitor<(anonymous namespace)::IRGenSILFunction, void>::visit(swift::ValueBase*) + 42611
8  swift                    0x000000010564a266 swift::irgen::IRGenModule::emitSILFunction(swift::SILFunction*) + 8678
9  swift                    0x00000001055cb6f8 swift::irgen::IRGenModule::emitGlobalTopLevel() + 184
10 swift                    0x00000001056376e3 performIRGeneration(swift::IRGenOptions&, swift::Module*, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, swift::SourceFile*, unsigned int) + 1859
11 swift                    0x0000000105638033 swift::performIRGeneration(swift::IRGenOptions&, swift::SourceFile&, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, unsigned int) + 51
12 swift                    0x00000001055aa65a frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 4842
13 swift                    0x00000001055a935d main + 1533
14 libdyld.dylib            0x00007fff8a82e5fd start + 1

1.  While emitting IR SIL function @_TFCSo6UIViewg6heightSd for 'anonname=0x7ff422892fd0' at <path redacted>/UIViewExtension.swift:60:5
<unknown>:0: error: unable to execute command: Segmentation fault: 11
<unknown>:0: error: swift frontend command failed due to signal (use -v to see invocation)
Command /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 254

如果需要更多信息来解决这个问题,请发表评论。谢谢!

编辑:

这是一个相关的.xcodeproj,它返回此问题的编译器错误。 Download here

51 个答案:

答案 0 :(得分:73)

我有这个错误,因为我这样做:

if(currentMeal?.State == .Deleted){

}

而不是

if(currentMeal!.State == .Deleted){

}

所以我认为如果条件可能导致此错误,则可选择不解包

答案 1 :(得分:24)

当您在Swift中遇到编译器段错误时,您没有得到方便的行号和错误消息。以下是如何跟踪问题:

  1. 在项目中创建一个名为SegFaultDebugger.swift的新文件。
  2. 在这个新文件中,定义一个给你问题的类的扩展名。
  3. 将一组方法从主文件移至SegFaultDebugger.swift
  4. 编译。
  5. 此时,发生以下三件事之一:

    • 您仍然可以在原始文件中获得段错误:将方法从SegFaultDebugger.swift移回原始文件,并将另一组方法移至SegFaultDebugger.swift。重复
    • 您在SegFaultDebugger.swift 中遇到了段错误:太棒了!现在使用二进制搜索将segfault固定到一个特定的方法,直到你可以找出导致它的结构。
    • 您获得了有意义的编译错误:太棒了!修复错误。一切都编译好后,将方法移回原始文件。

答案 2 :(得分:12)

我在扩展我的一个协议以及错误输入和可选类型参数时遇到此错误。

protocol SomeProtocolName: class {
    var someProtocolVariable: String { get set }

    func someProtocolFunction(someProtocolVariable: String)
}

// MARK:
extension SomeProtocolName {
    func someProtocolFunction(someProtocolVariable: String?) {
        self.someProtocolVariable = someProtocolVariable
    }
}

原型中的函数参数String和扩展中的String?之间的差异导致 Segmentation Fault 11

答案 3 :(得分:8)

我也遇到了这个错误,我这样修好了:

检查您的项目,找出哪些文件被使用了两次,然后删除一个,或删除并重新添加所有文件。

我的Xcode中的错误:

  

:0:错误:文件名“AttributedString.swift”使用了两次:   '/Users /.../CNJOB/CNJOB/AttributedString.swift'and   '/用户/.../ CNJOB / CNJOB / AttributedString.swift'

     

:0:注意:文件名用于区分私有   具有相同名称的声明

     

:0:错误:文件名“APIClient.swift”使用了两次:   '/Users /.../CNJOB/CNJOB/APIClient.swift'和   '/用户/.../ CNJOB / CNJOB / APIClient.swift'

     

:0:注意:文件名用于区分私有   具有相同名称的声明

     

Command / Applications / Xcode   3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc   退出代码1失败

答案 4 :(得分:7)

在Xcode 7中,您可以单击Debug Navigator中的错误,然后您将看到崩溃的展开视图。单击右侧的汉堡按钮会扩展错误,如果您一直向下滚动到扩展错误消息的底部,您将看到它来自何处。

enter image description here

对我来说,我有两个分段错误错误。在上图中,第一个是折叠时的样子,第二个是展开汉堡按钮时的样子。在展开的灰色框的最底部,您将看到一条消息,指出编译器崩溃的位置。

但请注意,错误消息有时可能不够丰富,因此虽然它告诉您崩溃的位置,但并不总是说明原因和解决方法。摆脱这个错误仍然是一个猜测问题。

答案 5 :(得分:5)

我发现了一个简单的解决方法,直到问题在未来的Xcode / Swift构建中修复:

  • 只需将导致问题的所有扩展名放在.swift文件中即可使用。

在您提供的示例项目中,将 UIViewExtension.swift CALayerExtension.swift 的内容放在上面 {{1 }}

希望这可以让我们编写工作 Swift代码,直到问题得到解决。

答案 6 :(得分:4)

至于我,将private添加到静态var固定clang崩溃:

private static var taskId = 0

答案 7 :(得分:2)

我在这样的语句中遇到了编译器分段错误:

someFunction(isFlagged ? "String1" : "String2")

我只是做了一个if-else语句而且有效。

答案 8 :(得分:2)

如果使用展开的Bool作为属性声明条件,也可能会出现此问题

答案 9 :(得分:1)

当编译器没有足够的信息(尽管你的想法)来保证/确定语句中的语句或变量的状态时,通常会发生这种情况。

例如,假设您有一个类型为[String:String]的字典,您可以使用城市名称作为键填充,并使用逗号分隔的相应邮政编码/邮政编码列表。

想象一下,您希望在代码中的某个位置更新相应代码的列表:

myDict[town] += newZipCode + ","

在这种情况下,编译器将响应分段错误,因为town可能不在字典中,因此无法保证上述语句将具有有效值。

要解决此问题,您应该将当前状态myDict[town]存储在一个单独的变量中,以便您处理key not in dict的情况,然后更新给定密钥的值:

myDict[town] = guaranteedValue + "," newZipCode + ","

不幸的是,确定根本原因并不总是直截了当所以我希望这个简单的例子有所帮助。

答案 10 :(得分:1)

就我而言,我尝试在变量参数之后添加一个函数参数。

反转参数序列并使变量参数成为参数列表中的最后一个参数。

答案 11 :(得分:1)

正如其他人在上面写到的那样,对我来说,这种情况发生在我使用协议扩展时,但协议中方法的签名与扩展中的实现不匹配。

在我的情况下,我在实现中添加了一个新参数(在扩展中),但忘了将其添加到协议中方法的签名中。

答案 12 :(得分:1)

我的情况,这发生在我在协议中进行不正确的静态初始化时。我找到了一种方法,但是编译器在构建时永远不会产生分段错误。

涉及三个文件。一个协议NamedSegues.swift,一个自定义的TableViewController,它实现了包含回调的协议,一个自定义的TableViewCell,它保存对该协议的引用以调用回调。

//file1
import Foundation
protocol NamedSegues {
    func  executeSegueWithId(id: String) -> Void
    static func getDefault() -> NamedSegues  // This was required because of init requirement in CustomCellView
}


//file2
class CustomController: UITableViewController, NamedSegues {
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCellWithIdentifier("CustomCellID", forIndexPath: indexPath ) as! CustomCellView

        // Configure the cell...
       //App logic...

        cell.parent = self
}

 //Mark: NamedSegues
     func executeSegueWithId(id: String) ->() {
        NSLog("Received callback to execute segue: \(id)")
        //
    }

    static func getDefault() -> NamedSegues { // I think this must be where it threw up.
        return self as! NamedSegues
    }

}


//file3

import UIKit

class CustomCellView: UITableViewCell {

    var id: String = "NoName"
    var parent: NamedSegues = NamedSegues.getDefault() // This is where it was needed.


override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        NSLog("Touched id: \(id)")


             parent.executeSegueWithId(id) // This is where parent was used.
     }
}

我用它来解决它?

在协议文件中,file1:删除getDefault()的声明 在CustomController file2中:删除getDefault的实现。 在CustomCellView中,file3:

    var parent: NamedSegues?
    ...
    parent?.executeSegueWithId(id)

编译器应该捕获这个并给出一些错误消息,而不是在构建期间抛出分段错误!

答案 13 :(得分:1)

当协议声明一个可选变量,并且一个实现者将该变量实现为一个惰性初始变量时,Swift 3.0(Xcode 8.1)就会出现这个问题。

这里报告了Bug: https://bugs.swift.org/browse/SR-1825

答案 14 :(得分:1)

Xcode 8.2。

@nonobjc协议实现添加到扩展中导致分段错误。 将@nonobjc协议实现移动到类实现中。

答案 15 :(得分:1)

就像 @Fjohn 所说的那样,这是一个与我展开一个可选项相关的问题(Xcode 7.0 beta 6和Xcode 7都破解了)。在我的情况下,我没有打开可选的可选项(在描述符中提示我是双重的。使用 如果让 解决了问题

double optional causing segmentation fault

答案 16 :(得分:1)

似乎Swift 2编译器可能还没有为黄金时段做好准备!如果这有助于任何人,我得到一个分段错误:11由于与闭包头中的变量类型不匹配,特别是在Parse方法中,function setthis($name, $value = "pampam"){ $GLOBALS[$name] = $value; }

您可以在此处详细了解此问题: https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/280

答案 17 :(得分:1)

在我的情况下,罪魁祸首是意外重载了一个函数,期望一个带有可变参数参数的数组参数:

public required init(_ args: Node...) {
}

当超类将其定义为数组时:

public required init(_ args: [Node]) {
}

答案 18 :(得分:1)

在我的情况下,这个错误,因为我使用类名称变量

var MYClass : MYClass {
    get {
        return.....
    }
}

这解决了我的问题

var myClass : MYClass {
    get {
        return.....
    }
}

答案 19 :(得分:1)

在我的情况下,字符串插值期间错位的冒号破坏了我的(XCode 6.1.1)。

示例:

println("\(value1:value2)") 

当我打算做的时候:

println("\(value1) : \(value2)")

答案 20 :(得分:1)

就我而言,我在struct内声明了func。将struct移到班级可以解决问题。

现在我写了这篇文章,我记得之前在struct s内遇到func的问题。除了分段错误之外还有别的东西(在Swift 1.2测试版中它似乎变得臭名昭着)。 OMG Apple,你在那做什么?

答案 21 :(得分:1)

由于运算符函数上存在无关的泛型类型,例如

,因此会出现此错误
func ==<T>(lhs: Foo, rhs: Foo) -> Bool {
  return lhs.bar == rhs.bar
}

就我而言,删除<T>解决了问题。

答案 22 :(得分:1)

如果您不小心声明了与其名称匹配的类型的变量,也会发生此错误:

    var sectionGroup: sectionGroup? { ... }

答案 23 :(得分:1)

我今天遇到了一些例外

class func createByAny(instance: Any?) -> ApiCollectionResponse { ... }

这解决了它:

class func createByAny(instance: Any) -> ApiCollectionResponse { ... }

因为“Any”类型是任何类型的事件“nil”,“AnyObject”,可选,...... :) 它不能是可选的,它已经是可选的。

typealias Any = protocol<>

答案 24 :(得分:1)

当我尝试从父类覆盖弱变量时,发生了这个错误。

在基类中:

weak var stripeViewDelegate : StripeViewDelegate? = nil    

派生类:

override weak var stripeViewDelegate : StripeViewDelegate? = nil {
    didSet {
        self.stripeView.delegate = stripeViewDelegate

    }

当我从派生类中删除=nil时,错误消失了。

答案 25 :(得分:0)

在我的情况下,问题是,我在项目中有“Math.h”自定义文件和类,导入和使用它会导致问题。

最奇怪的是,这个文件在过去的18天里都在项目中,但一切正常。我想,这取决于我如何使用它,在Objective-C项目中使用它,不会引起任何问题。

因此,最好仔细检查班级名称。

答案 26 :(得分:0)

在我的情况下,问题在于使用UITextFieldDelegate协议扩展到我的班级:

extension LoginPresenter: UITextFieldDelegate {}

要解决问题,我将其移至类定义:

class LoginPresenter<T: LoginInteractionProtocol>: BasePresenter<T>, LoginPresenterProtocol, UITextFieldDelegate {
}

答案 27 :(得分:0)

使用Swift 3

在Xcode 8上出现此错误

我必须从中删除throws关键字:

public extension FileManager {
    public func foo() throws -> URLRelationship {
        return URLRelationship.other
    }
}

到此:

public extension FileManager {
    public func foo() -> URLRelationship {
        return URLRelationship.other
    }
}

答案 28 :(得分:0)

就我而言,我不得不改变这一点:

listItem.sortingOrder -= 1

到此:

listItem.sortingOrder = listItem.sortingOrder - 1

我通过查看有问题的函数(由构建错误消息While emitting SIL for 'myBadFunction'指出),逐个代码行直到它工作,然后专注于有问题的代码行并尝试不同的东西来找到它。祝你好运。

答案 29 :(得分:0)

我通过删除Build Settings配置&#34; Objective-C Bridging Header&#34;解决了这个问题。字符串我已手动添加。

答案 30 :(得分:0)

我正在使用xcode 7.3。中午过后很好。我突然开始看到Objective Fault 11用于Objective C样式选择器。 我不知道xcode翻转在我身上有什么变化(当然我没有更新任何东西)。它真的只是下一次运行,它开始吓坏了。 但是,我可以在一个xcode抱怨的特定文件中添加#selector后得到我的项目编译。

奇怪的是,它并没有抱怨其他文件。它只针对一个文件。

我的建议看看xcode抱怨的文件然后处理它为swift 3投掷的所有警告。你可能能够通过这个seg错误。

此时此刻仍未知原因。因为我能够克隆相同的项目,其他地方和编译就好了。

答案 31 :(得分:0)

我遇到了此错误,因为我的课程不符合none

答案 32 :(得分:0)

出现此错误是因为我在未为Swift 5.1设置的目标中使用了Swift 5.1的功能。具体来说,我使用Self.来访问静态函数,而不是ClassName.来访问静态函数,该函数在Swift 5.1中可用,但是尝试在较旧的目标中使用它会导致相同的错误。

答案 33 :(得分:0)

我从Xcode 9迁移到10.2。这是一个有问题的地方

struct AbstractField<T>: ValidatableField {
    var name: String
    var value: Observable<Validated<T>>
    var setValue: (Validated<T>) -> Void
    var hint: Variable<String?>
    var error: Variable<AviaFieldError?>
    var isHidden: Binder<Bool>
    var isBeingEdited: Observable<Bool>
    var silentMode: Variable<Bool>
}

为解决一个问题,我替换了var以便进行setValue封闭。

struct AbstractField<T>: ValidatableField {
    var name: String
    var value: Observable<Validated<T>>
    let setValue: (Validated<T>) -> Void
    var hint: Variable<String?>
    var error: Variable<AviaFieldError?>
    var isHidden: Binder<Bool>
    var isBeingEdited: Observable<Bool>
    var silentMode: Variable<Bool>
}

似乎很难为编译器解析此构造。

答案 34 :(得分:0)

Apple应该在Xcode中修复此问题,以便为我们所有人提供更好的体验。 我建议你在这里记录一个关于苹果的错误:https://bugreport.apple.com和参考错误:32707221所以他们看到它影响了多少人。

对我而言,它无法解开2个物体

例如:

if let passengers = car?.passengers, 
let car = car {
} 

而不是

if let car = car,
let passengers = car.passengers
 {
}
很难找到!

答案 35 :(得分:0)

遵循此过程:

  1. 更新现有项目的 Pod
  2. 转到编辑并选择转换 > 当前 swift 语法
  3. 在构建设置中启用位码为“NO”
  4. 添加运行项目

答案 36 :(得分:0)

我得到了同样的错误并浪费了几个小时,直到我在代码中看到这个错误:

let databaseRef: FIRDatabaseReference? = FIRDatabase.database().reference()

问题是FIRDatabaseReference? 将其更改为

let databaseRef: FIRDatabaseReference = FIRDatabase.database().reference()

它开始像魅力一样工作!希望这个答案有所帮助!

答案 37 :(得分:0)

通过在存档模式下删除此功能解决了我的问题:

debugPrint(someObject)

答案 38 :(得分:0)

当我有一个包含32个字段的结构时,我遇到了这个问题。我删除了一个字段,一切都很好。

答案 39 :(得分:0)

对于我来说,尝试分配一个我解开的lines.last!的get属性导致了这个问题。这段代码是无效的语法,但编译器不会接受它。

    var lines : [Line] = [Line()]

    var line : Line {
        get {
            return lines.last!
        } set {
            lines.last! = newValue
        }
    }

答案 40 :(得分:0)

我今天也遇到了这个问题。在我的情况下,我在单元测试文件中实现了协议,忘了实现默认协议实现遗漏的一种方法。

答案 41 :(得分:0)

我的是由于在没有可选回报的情况下重叠的冲突......

基类:

func functionName(bla:String) -> UIView?

派生类:

func functionName(bla:String) -> UIView

电话失败了,而不是func声明。

functionName("Help")

答案 42 :(得分:0)

我也有同样的错误,但在我看来,我的Xcode在构建时遇到了一些问题,在构建好几次后错误消失了,但是在我将Xcode更新为7后,错误消失了

答案 43 :(得分:0)

我会抛出我在环中遇到这种崩溃的原因,因为许多不同的问题似乎导致了这个编译器问题的变化。

我的“在发出SIL时”引用了一个'observeValueForKeyPath'方法,我不能在我的生活中找出它的错误(它在swift 1.2中运行良好)。奇怪的是,这个问题最终围绕我的案例陈述括起来。

这在Swift 2.0之前有效......

switch (context) {
case(&myContext):
    print("observed")
}

这停止了编译错误......

switch (context) {
case &myContext:
    print("observed")
}

希望这个答案有助于一些人节省一点时间。

答案 44 :(得分:0)

对我来说问题是:

var startIndex : Int = etc...

然后我有:

startIndex++

评论startIndex++阻止了错误,因此解决方法是使用startIndex : Double并将其比较等同于Double

答案 45 :(得分:0)

发现了另一种在尝试使用Argo空结构时出现此错误的方法:

导致分段错误11:

struct Action {
//  let foo: String
}

extension Action: Decodable {
  static func decode(json: JSON) -> Decoded<Action> {
    return .MissingKey("foo")
  }
}

编译得很好:

struct Action {
  let foo: String
}

extension Action: Decodable {
  static func decode(json: JSON) -> Decoded<Action> {
    return .MissingKey("foo")
  }
}

叹息。

答案 46 :(得分:0)

看起来它可能是由很多原因造成的。在我的情况下,它是pch文件 - 当我尝试在bridging-header.h中导入.pch文件时,我得到了分段错误,我认为它可能是由PROJECT-swift.h内部引起的。所以我应该做的是将所有快速需求放入另一个const.h中,并在{.pch和#import "const.h"中放入bridgng-header.h。这是我犯的一个非常愚蠢的错误,但希望它可以帮助一些随机的家伙过来。

答案 47 :(得分:0)

我在一个快速的项目中遇到了同样的问题。问题是应该返回一个对象的函数,但是没有返回它。在使用Obj-C进行编辑时,这种错误曾经被用来发出信号。似乎在Swift中并非如此。

答案 48 :(得分:0)

对我来说,问题是我的架构没有达到标准。我已经添加了i386或其他东西,只需将其设置回默认的xcodeproject arch并且编译得很好。

答案 49 :(得分:0)

我在扩展程序中遇到了同样的问题。我的扩展程序有两个便利初始化程序:

convenience init(context: NSManagedObjectContext) {
    let entityDescription = NSEntityDescription.entityForName("PropertyEntity", inManagedObjectContext: context)!
    self.init(entity: entityDescription, insertIntoManagedObjectContext: context)
}

convenience init(dictionary: NSDictionary, context: NSManagedObjectContext) {
    self.init(context: context)
    property1 = (dictionary["key"] as? String) ?? ""
    // More properties...
}

为了摆脱错误,我添加了一个实例方法映射(字典:NSDictionary),并且分段错误消失了。

convenience init(dictionary: NSDictionary, context: NSManagedObjectContext) {
    self.init(context: context)
    map(dictionary)
}

答案 50 :(得分:0)

我在自定义UITableViewController中使用以下方法签名收到此错误。

func filterContentForSearchText(searchText: String)

更改为:

func filterContentForSearchText(searchText: String!)

修复了问题。