构建时出现Swift编译器分段错误


100

在我的文件中添加一个(便捷的)计算height属性会导致Swift编译器出现段错误...这可能是哪里出了问题?UIViewUIViewExtension.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,它返回此问题的编译器错误。在这里下载


7
编译器不应出现段错误。如果这是新问题,请提交错误报告。
Karoly Horvath 2014年

3
看起来像一个编译器错误。您应该将其报告给Apple,以便他们进行梳理。
Chuck

11
在将Objective-C项目迁移到Swift时,编译器一直在左右隔离。至少可以说这令人沮丧。
aleclarson

1
@aleclarson我认为发行版本会更好,但是如果发现错误,我将报告它们,因为这可能是它们在发行前得到修复的唯一方法。
Joachim Isaksson 2014年

6
我真希望SWIFT可以立即使用。等待糟透了!:)
aleclarson

Answers:


75

我有此错误,因为我正在这样做:

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

}

代替

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

}

所以我认为如果情况可能导致此错误,则不要打开可选的包装


3
这也是我的原因。但这应该是正确的吗?这只是一个编译器错误是它
DeFrenZ

相同。可选的枚举检查。希望他们能解决问题
Mente 2014年

正确的代码应为:if(currentMeal.State == .Deleted){},因为Swift可以使相等的两个可选参数重载==。Fjohn的职务非常危险。
mattyohe 2015年

1
这与编译错误有关,如果之前未验证变量,我过去的代码很危险。如果currentMeal为nil,您的代码又如何呢?是一样的吗?您能解释一下为什么我的代码比您的代码更危险吗?迅速利用可选的优势,而无需使用“?” ?
Fjohn

谢谢,这也是我的情况。Swift一直给我带来不愉快的惊喜,但是这个超出了极限。
CodeBrew

26

在Swift中遇到编译器段错误时,您不会得到方便的行号和错误消息。您可以通过以下方法查找问题:

  1. SegFaultDebugger.swift在您的项目中创建一个新文件。
  2. 在这个新文件中,定义给您带来问题的类的扩展。
  3. 将一组方法从主文件移到SegFaultDebugger.swift
  4. 编译。

此时,发生三件事之一:

  • 您仍然可以在原始文件中找到segfault:将方法从原始文件SegFaultDebugger.swift回,然后将另一组方法移入SegFaultDebugger.swift。重复
  • 您在中遇到段错误SegFaultDebugger.swift:太好了!现在,使用二进制搜索将段错误固定为特定方法,直到您找出导致它的构造。
  • 您会得到有意义的编译器错误:太好了!解决错误。一切编译完成后,将方法移回原始文件。

1
谢谢!经过数小时的抓挠,这有所帮助。
dejavu89

1
这非常有用!就我而言,我在扩展中拥有了NSFetchedResultsControllerDelegate,足以将其合并回主类块。
MikaelGrön17年

@MikaelGrön-您可以对此进行扩展吗?您在扩展程序中到底拥有什么?
RyanJM

但是,您怎么知道哪一门课给您带来问题呢?
牧师

@theReverend如果不确定,则必须尝试在有问题的文件中尝试每个类。但是swiftc几年来并没有真正出现过段错误问题-不确定我的答案是否已经有用。
比尔

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?扩展中函数自变量的差异导致分段错误11


3
我也是。看起来Apple的可选键入存在一些问题。一个主要问题是何时!在变量类型内部使用。默认情况下它是非可选的,但是编译器会感到困惑。
user1122069 '16

@ user1122069同意,协议还有一些问题。希望在下一版本中将解决此问题。
victor.vasilica

总的来说,我不是在谈论协议。我刚刚学到了什么!确实在变量内,但IDE和编译器通常无法获得!的准确错误。
user1122069 '16

@ user1122069我不好,很抱歉。
victor.vasilica '16

当在数组中添加很多项目时,这发生在我身上
aguilarpgc

9

我也有这个错误,我这样修复:

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

我的Xcode中的错误:

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

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

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

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

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


8

在Xcode 7中,您可以单击Debug Navigator中的错误,然后将显示崩溃的扩展视图。单击右侧的汉堡包按钮将展开错误,并且如果一直滚动到展开的错误消息的底部,您将看到错误的来源。

在此处输入图片说明

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

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


1
能够从导航器中查找错误。谢谢,这帮助我纠正了错误!
Vishal Chandran

5

我发现了一个简单的解决方法,直到在以后的Xcode / Swift构建中解决该问题为止:

  • 只需将引起问题的所有扩展名放入.swift正在使用的文件中。

在您提供的示例项目中,把内容 UIViewExtension.swift CALayerExtension.swift 上述 AppDelegate.swift

希望这可以使我们编写有效的 Swift代码,直到问题解决。


4

对我来说,添加private到静态var修复了clang崩溃:

private static var taskId = 0

2

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

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

我只是做了一个if-else语句而已。


1
Swift 3:这个答案解决了许多项目中的细分错误11。
亚历山德罗·奥纳诺

哇,真令人难以置信。Swift编译器看起来像带有所有这些问题的Alpha版本。这次真是万分感谢。
TGO

2

如果您声明一个具有未包装的Bool作为属性的条件,也会出现此问题


1

在我的情况下,在字符串内插过程中冒号放错了位置(XCode 6.1.1)。

例:

println("\(value1:value2)") 

当我打算这样做时:

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

1

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

在基类中:

weak var stripeViewDelegate : StripeViewDelegate? = nil    

派生类:

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

    }

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


1

我今天有些例外

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

这解决了它:

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

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

typealias Any = protocol<>

我的情况也与“任何”问题
阿德里亚诺Spadoni

1

如果您意外地声明了一个类型与其名称匹配的变量,也会发生此错误:

    var sectionGroup: sectionGroup? { ... }

如果您遵循Apple的命名约定并为该类型使用首个大写字母,那么这将不是问题。这很可能就是苹果公司没有绊倒它的原因。此外,您的答案似乎与@aminhotob的答案相同
qwerty_so 2015年

1

由于运算符上的泛型类型而导致此错误,例如

func ==<T>(lhs: Foo, rhs: Foo) -> Bool {
  return lhs.bar == rhs.bar
}

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


这里存在相同的问题,通常来说,定义未实际使用的泛型似乎会导致此错误。
凯文R

1

就我而言,我已经声明了struct一个func。移动struct到类级解决的问题。

现在,我写了这篇文章,我记得以前在struct内部funcs 遇到过问题。除了分段错误(Swift 1.2 beta似乎臭名昭著)之外,这还不算什么。OMG Apple,您在那儿做什么?


我在结构中有3个变量,并且工作正常,添加了第4个变量,导致出现分段错误问题。将结构更改为类为我解决了问题
Ehab Amer

1

就我而言,此错误是因为我将类名用作变量

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

这解决了我的问题

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

1

就我而言,这发生在我在协议中执行了不正确的静态初始化时。我找到了一种解决方法,但是编译器在构建时绝不应产生分段错误。

涉及三个文件。协议名为Segues.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)

编译器应该已经抓住了这个问题并给出了一些错误消息,而不是在构建过程中抛出分段错误!



1

就像@Fjohn所说的那样,这与为我解压缩一个可选项有关(Xcode 7.0 beta 6和Xcode 7中都存在中断)。在我的情况下,我没有解开optional选项(在描述符中提示我的内容是double ??。使用if let解决了问题)

双重可选导致细分错误


1

正如其他人在上面所述,对我来说,这是在我使用协议扩展时发生的,但是协议中方法的签名与扩展中的实现不匹配。

就我而言,我已经在实现中(在扩展名中)添加了一个新参数,但是忘记了也将其添加到协议中方法的签名中。


1

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

反转参数序列并将可变参数作为参数列表中的最后一个参数对其进行固定。


1

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

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

想象一下,您想在代码中的某个地方更新相应代码的列表:

myDict[town] += newZipCode + ","

在这种情况下,编译器将响应以下错误: town可能不在字典中,因此它不能保证上面的语句将具有有效值。

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

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

不幸的是,确定根本原因并不总是那么简单,因此我希望这个简单的例子能有所帮助。




1

在我的案例中,罪魁祸首是意外重载了一个函数,该函数期望一个数组参数带有一个带有可变参数的数组

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

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

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

0

对我来说,以下是引起段错误,而这type是可选的:

switch type {
    case .aType:
        // Do Something
    default:
        break
}

这解决了它:

switch type {
    case .Some(.aType):
        // Do Something
    default:
        break
}

0

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

func filterContentForSearchText(searchText: String)

更改为:

func filterContentForSearchText(searchText: String!)

解决了问题。


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...
}

为了消除该错误,我添加了一个实例方法map(dictionary:NSDictionary),并且分段错误错误消失了。

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

0

对我而言,问题在于我的体系结构未设置为标准。我已经添加了i386之类的东西,只需将其设置回默认的xcodeproject arch即可,并且编译良好。


0

我在一个快速的项目中遇到了同样的问题。问题是应该返回一个对象但没有返回值的函数。使用Obj-C编辑时通常会发出此类错误信号。在Swift中似乎并非如此。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.