构建时Swift编译器分段错误

taut 发布于 2019-05-21 swift 最后更新 2019-05-21 10:10 88 浏览

在我的UIViewExtension.swift文件中向UIView文件中添加一个(方便的)计算height属性会导致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
&NBSP;
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

已邀请:

dsit

赞同来自:

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

enter image description here 对我来说,我有两个分段错误错误。在上图中,第一个是折叠时的样子,第二个是扩展汉堡按钮时的样子。在展开的灰色框的最底部,您将看到一条消息,指出编译器崩溃的位置。 但请注意,错误消息有时可能不够丰富,因此虽然它告诉您崩溃的位置,但并不总是说明原因以及如何修复它。摆脱这个错误仍然是一个猜测的问题。

sit_in

赞同来自:

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

zquia

赞同来自:

我正在使用xcode 7.3。中午过后很好。我突然开始看到Objective Fault 11用于Objective C样式选择器。 我不知道xcode翻转在我身上有什么变化(当然我没有更新任何东西)。它实际上只是下一次运行,它开始吓坏了。 但是我可以在一个xcode抱怨的特定文件中添加#selector后得到我的项目编译。 奇怪的是,它并没有抱怨其他文件。它只针对一个文件。 我的建议看看xcode抱怨的文件然后处理它为swift 3投掷的所有警告。你可能能够通过这个seg错误。 仍然在这个时刻原因未知。因为我能够克隆相同的项目,然后编译就好了。

sit_in

赞同来自:

就我而言,我不得不改变:

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

desse

赞同来自:

通过在归档模式中删除此功能解决了我的问题

debugPrint(someObject)

fet

赞同来自:

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

someFunction(isFlagged ? "String1" : "String2")
我只是做了一个if-else语句而且它有效。

oautem

赞同来自:

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

private static var taskId = 0

khic

赞同来自:

使用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
    }
}

aad

赞同来自:

由于操作员函数上的无关泛型类型(例如,操作函数),因此会出现此错误。

func ==<T>(lhs: Foo, rhs: Foo) -> Bool {
  return lhs.bar == rhs.bar
}
就我而言,删除<T>解决了这个问题。

gnihil

赞同来自:

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

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

xqui

赞同来自:

我会抛出我在环中发生这种崩溃的原因,因为许多不同的问题似乎导致了这个编译器问题的变化。 我的“在发出SIL时”引用了一个'observeValueForKeyPath'方法,我不能在我的生活中找出它的错误(它在swift 1.2中运行良好)。奇怪的是,这个问题最终围绕我的案例陈述括号。 这在Swift 2.0之前有用......

switch (context) {
case(&myContext):
    print("observed")
}
这停止了​​编译错误......
switch (context) {
case &myContext:
    print("observed")
}
希望这个答案可以帮助一些人节省一点时间。

nodio

赞同来自:

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

  1. 在项目中创建一个名为SegFaultDebugger.swift的新文件。
  2. 在这个新文件中,定义一个给你问题的类的扩展名。
  3. 将一组方法从主文件移至SegFaultDebugger.swift
  4. 编译。
此时,发生以下三种情况之一:
  • 您仍然可以在原始文件中获得segfault:将方法从SegFaultDebugger.swift移回原始文件,并将一组不同的方法移动到SegFaultDebugger.swift中。重复
  • 你在SegFaultDebugger.swift中遇到了一个段错误:好极了!现在使用二进制搜索将segfault固定为特定方法,直到你能够找出导致它的构造。
  • 你得到了有意义的编译错误:太棒了!修复错误。一旦所有内容都编译完毕,请将方法移回原始文件中。

iest

赞同来自:

对于我试图分配一个我解开lines.last!引起问题的get属性。此代码是无效的语法,但编译器不会接受它。

    var lines : [Line] = [Line()]
var line : Line {
        get {
            return lines.last!
        } set {
            lines.last! = newValue
        }
    }

mneque

赞同来自:

我通过删除我手动添加的Build Settings配置“Objective-C Bridging Header”字符串解决了这个问题。

iaut

赞同来自:

就我而言,问题是,我在项目中有“Math.h”自定义文件和类,导入和使用它会导致问题。 最奇怪的是,这个文件在过去的18天里都在项目中,但一切正常。我想,这取决于我如何使用它,在Objective-C项目中使用它,不会引起任何问题。 因此,最好仔细检查类名称。

ramet

赞同来自:

我的情况,这发生在我在协议中进行不正确的静态初始化时。我找到了一种方法,但编译器在构建时不应该产生分段错误。 涉及三个文件。一个协议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)
编译器应该捕获这个并给出一些错误消息,而不是在构建期间抛出分段错误!

walias

赞同来自:

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

    var sectionGroup: sectionGroup? { ... }

cvitae

赞同来自:

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

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。

yvitae

赞同来自:

就像@Fjohn所说的那样,这是一个与我解开一个可选项相关的问题(在Xcode 7.0 beta 6和Xcode 7中都破了)。在我的情况下,我没有打开可选的可选项(在描述符中提示我是双倍的。使用if let let the resolved double optional causing segmentation fault

lenim

赞同来自:

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

var MYClass : MYClass {
    get {
        return.....
    }
}
这解决了我的问题
var myClass : MYClass {
    get {
        return.....
    }
}

fharum

赞同来自:

对我来说问题是:

var startIndex : Int = etc...
然后我有:
startIndex++
注释掉startIndex++会阻止错误,因此修复是使用startIndex : Double并将其比较转换为Double

in_ut

赞同来自:

在尝试使用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")
  }
}
叹。

zhic

赞同来自:

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

uaut

赞同来自:

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

  • 只需将导致问题的所有扩展程序放在正在使用的.swift文件中。
在您提供的示例项目中,将UIViewExtension.swiftCALayerExtension.swift的内容放在AppDelegate.swift上方 希望这可以让我们编写工作Swift代码,直到问题得到解决。

gest

赞同来自:

我今天抓到了一些例外

class func createByAny(instance: Any?) -> ApiCollectionResponse { ... }
这解决了它:
class func createByAny(instance: Any) -> ApiCollectionResponse { ... }
因为“Any”类型是任何类型的事件“nil”,“AnyObject”,可选,...... :) 它不能是可选的,它已经是可选的。
typealias Any = protocol<>

qfugit

赞同来自:

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

func filterContentForSearchText(searchText: String)
改为:
func filterContentForSearchText(searchText: String!)
解决了这个问题。

nrerum

赞同来自:

Apple应该在Xcode中修复此问题,以便为我们所有人提供更好的体验。 我建议你在这里记录苹果的一个错误:https://bugreport.apple.com和参考错误:32707221,这样他们就可以看到它影响了多少人。 对我来说,它解开了两个乱序的物体 例如:

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

pquo

赞同来自:

如果声明一个包含未打包的Bool作为属性的条件,也可能会出现此问题

tin

赞同来自:

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

if(currentMeal?.State == .Deleted){
}
代替
if(currentMeal!.State == .Deleted){
}
所以我认为如果条件可以导致此错误,则可选择不解包

verror

赞同来自:

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

zquam

赞同来自:

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

zamet

赞同来自:

在我的情况下,我在func中声明了一个struct。将struct移至类级别解决了该问题。 现在我写了这个,我记得之前在funcs中遇到了struct的问题。除了分段错误之外还有别的东西(在Swift 1.2测试版中它似乎变得臭名昭着)。 OMG Apple,你在那做什么?

daut

赞同来自:

当我试图从父类重写弱变量时,发生了这个错误。 在基类中:

weak var stripeViewDelegate : StripeViewDelegate? = nil    
派生类:
override weak var stripeViewDelegate : StripeViewDelegate? = nil {
    didSet {
        self.stripeView.delegate = stripeViewDelegate
}
当我从派生类中删除=nil时,错误消失了。

out

赞同来自:

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

nfugit

赞同来自:

正如其他人在上面所写,对我来说,当我使用协议的扩展但协议中的方法签名与扩展中的实现不匹配时,就会发生这种情况。 在我的例子中,我在实现中添加了一个新参数(在扩展中)但是忘了将它添加到协议中方法的签名中。

psequi

赞同来自:

我也有这个错误,我修复它: 检查您的项目并找出两次使用哪些文件并删除一个,或删除并重新添加所有文件。 我的Xcode中的错误:

:0: error: filename "AttributedString.swift" used twice: '/Users/.../CNJOB/CNJOB/AttributedString.swift' and '/Users/.../CNJOB/CNJOB/AttributedString.swift' :0: note: filenames are used to distinguish private declarations with the same name :0: error: filename "APIClient.swift" used twice: '/Users/.../CNJOB/CNJOB/APIClient.swift' and '/Users/.../CNJOB/CNJOB/APIClient.swift' :0: note: filenames are used to distinguish private declarations with the same name Command /Applications/Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1

daut

赞同来自:

在我的情况下,我尝试在variadic参数后添加一个函数参数。 反转参数序列并使变量参数成为参数列表中的最后一个参数。

ksequi

赞同来自:

另一个崩溃问题: 下面的变化导致Xcode 8.2b2编译器在我的代码中的三个位置崩溃:

return self.initialValue.mutableCopy() as AnyObject!
self.initialValue定义为:
fileprivate  let initialValue:AnyObject!
我为此创建了各种修复程序,具体取决于我的代码中的上下文。这是一个修复:
let initialSetValue = self.initialValue as! NSMutableSet
let copy = NSMutableSet(set: initialSetValue);
return copy

wquod

赞同来自:

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

let databaseRef: FIRDatabaseReference? = FIRDatabase.database().reference()
问题是FIRDatabaseReference? 改为
let databaseRef: FIRDatabaseReference = FIRDatabase.database().reference()
它开始像一个魅力!希望这个答案有帮助!

lnulla

赞同来自:

当编译器没有足够的信息(尽管你的想法)来保证/确定语句的状态或语句中的变量时,通常会发生这种情况。 例如,假设您有一个类型为[String:String]的字典,您可以使用城市名称作为键填充,并使用逗号分隔的相应邮政编码/邮政编码列表。 想象一下,您希望在代码中的某个位置更新相应代码的列表:

myDict[town] += newZipCode + ","
在这种情况下,编译器将响应分段错误,因为town可能不在字典中,因此无法保证上述语句将具有有效值。 要解决此问题,您应将myDict[town]的当前状态存储在单独的变量中,以便您处理key not in dict的情况,然后更新给定键的值:
myDict[town] = guaranteedValue + "," newZipCode + ","
不幸的是,确定根本原因并不总是直截了当所以我希望这个简单的例子有所帮助。

ut_sit

赞同来自:

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

bdicta

赞同来自:

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

switch type {
    case .aType:
        // Do Something
    default:
        break
}
这解决了它:
switch type {
    case .Some(.aType):
        // Do Something
    default:
        break
}

gnihil

赞同来自:

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

lnon

赞同来自:

当协议声明一个可选变量时,Swift 3.0(Xcode 8.1)就会出现这个问题,而一个实现者将该变量实现为一个惰性初始变量。 这里报告了Bug: https://bugs.swift.org/browse/SR-1825

datque

赞同来自:

我的是由于在没有可选回报的情况下超控的冲突...... 基类:

func functionName(bla:String) -> UIView?
派生类:
func functionName(bla:String) -> UIView
它没有通过电话,而不是功能声明。
functionName("Help")

aut_id

赞同来自:

看起来像Swift 2编译器可能还没有为黄金时段做好准备!如果这有助于任何人,我得到一个分段错误:11由于与闭包头中的变量类型不匹配,特别是在Parse方法PFQuery.query.findObjectsInBackgroundWithBlock中。 您可以在此处更详细地查看该问题: https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/280

xnam

赞同来自:

在我的例子中,字符串插值期间错位的冒号破坏了我的(XCode 6.1.1)。 例:

println("\(value1:value2)") 
当我打算做的时候:
println("\(value1) : \(value2)")