Schneller Compilersegmentierungsfehler beim Erstellen

100

Das Hinzufügen einer (praktischen) berechneten heightEigenschaft zu UIViewmeiner UIViewExtension.swiftDatei führt dazu, dass der Swift-Compiler fehlerhaft wird ... Was könnte hier möglicherweise schief gehen?

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

Wenn weitere Informationen benötigt werden, um dies zu knacken, kommentieren Sie einfach. Vielen Dank!

Bearbeiten:

Hier ist eine verwandte .xcodeproj, die den Compilerfehler dieser Frage zurückgibt. Hier herunterladen

Aleclarson
quelle
7
Compiler sollten nicht segfault. Wenn dies ein neues Problem ist, reichen Sie einen Fehlerbericht ein.
Karoly Horvath
3
Sieht aus wie ein Compiler-Fehler. Sie sollten es Apple melden, damit sie es klären können.
Chuck
11
Der Compiler hat links und rechts einen Fehler gemacht, als ich ein Objective-C-Projekt nach Swift migriert habe. Es war gelinde gesagt entmutigend.
Aleclarson
1
@aleclarson Ich gehe davon aus, dass die Release-Version besser funktioniert, aber wenn Sie Fehler finden, würde ich sie melden, da dies möglicherweise die einzige Möglichkeit ist, sie vor der Veröffentlichung zu beheben.
Joachim Isaksson
6
Ich dachte, Swift würde sofort einsatzbereit sein. Warten ist scheiße! :)
Aleclarson

Antworten:

74

Ich hatte diesen Fehler, weil ich das tat:

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

}

anstatt

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

}

Daher denke ich, dass optional nicht ausgepackt wird, wenn der Zustand diesen Fehler verursachen kann

Fjohn
quelle
3
Das war auch für mich der Grund. Aber das sollte richtig sein, oder? Es ist nur ein Compiler-Fehler, oder
DeFrenZ
Gleich. Optionale Aufzählung. Hoffe, sie beheben es
mente
Der richtige Code wäre: if (currentMeal.State == .Deleted) {} ​​as Swift überlädt == hilfreich für zwei Optionen, die gleichwertig sind. Fjohns Posten ist ziemlich gefährlich.
Mattyohe
1
Es geht um einen Kompilierungsfehler. Der Code, den ich eingefügt habe, ist gefährlich, wenn die Variable zuvor nicht überprüft wurde. Was ist mit deinem Code, wenn currentMeal null ist? es ist das gleiche nein? Können Sie mir bitte erklären, warum mein Code gefährlicher ist als Ihr Code? schnell nutzen optional, ohne "?" ?
Fjohn
Danke, das ist auch mein Fall. Swift hat mich auf dem ganzen Weg unangenehm überrascht, aber dieser ist weit über dem Limit.
CodeBrew
26

Wenn Sie in Swift auf einen Compiler-Segfault stoßen, erhalten Sie keine praktische Zeilennummer und Fehlermeldung. So können Sie das Problem aufspüren:

  1. Erstellen Sie eine neue Datei mit dem Namen SegFaultDebugger.swiftin Ihrem Projekt.
  2. Definieren Sie in dieser neuen Datei eine Erweiterung für die Klasse, die Probleme verursacht.
  3. Verschieben Sie eine Gruppe von Methoden aus der Hauptdatei nach SegFaultDebugger.swift.
  4. Kompilieren.

An diesem Punkt passiert eines von drei Dingen:

  • Sie erhalten weiterhin den Segfault in der Originaldatei : Verschieben Sie die Methoden von SegFaultDebugger.swiftzurück in die Originaldatei und verschieben Sie einen anderen Satz von Methoden inSegFaultDebugger.swift . Wiederholen
  • Du bekommst einen Segfault inSegFaultDebugger.swift : Großartig! Verwenden Sie nun die binäre Suche, um den Segfault auf eine bestimmte Methode festzulegen, bis Sie herausfinden können, welches Konstrukt ihn verursacht.
  • Sie erhalten aussagekräftige Compilerfehler : Großartig! Beheben Sie die Fehler. Sobald alles kompiliert ist, verschieben Sie Ihre Methoden zurück in die Originaldatei.
Rechnung
quelle
1
Vielen Dank! Dies half nach stundenlangem Kratzen am Kopf.
Dejavu89
1
Das war sehr nützlich! In meinem Fall hatte ich mein NSFetchedResultsControllerDelegate in einer Erweiterung und es war genug, um es wieder mit dem Hauptklassenblock zusammenzuführen.
Mikael Grön
@ MikaelGrön - kannst du das erweitern? Was genau hattest du in der Erweiterung?
RyanJM
Aber woher weißt du, welche Klasse dir die Probleme gibt?
der Reverend
@theReverend Wenn Sie sich nicht sicher sind, müssen Sie jede Klasse in der fehlerhaften Datei ausprobieren. Aber swiftc hatte seit einigen Jahren kein Segfault-Problem mehr - ich bin mir nicht sicher, ob meine Antwort überhaupt noch relevant ist.
Bill
12

Ich habe diesen Fehler beim Erweitern eines meiner Protokolle und beim falsch eingegebenen und optionalen Typargument erhalten.

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

    func someProtocolFunction(someProtocolVariable: String)
}

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

Der Unterschied in den Funktionsargumenten Stringim Prototyp und String?in der Erweiterung verursachte den Segmentierungsfehler 11 .

victor.vasilica
quelle
3
Ich habe das auch. Apple hat anscheinend einige Probleme mit der optionalen Eingabe. Ein großes Problem ist, wann! wird innerhalb eines Variablentyps verwendet. Es ist standardmäßig nicht optional, aber der Compiler wird verwirrt.
user1122069
@ user1122069 stimme zu, Protokolle haben noch einige Probleme. Hoffe, mit den nächsten Versionen werden diese Probleme behoben.
victor.vasilica
Ich habe nicht über Protokolle gesprochen, nur im Allgemeinen. Ich habe gerade was gelernt! funktioniert innerhalb einer Variablen, aber die IDE und der Compiler erhalten häufig keine genauen Fehler für!
user1122069
@ user1122069 mein schlechtes, sry.
victor.vasilica
Dies geschah mir, als ich viele Elemente in ein Array
einfügte
9

Ich hatte auch diesen Fehler und habe ihn folgendermaßen behoben:

Überprüfen Sie Ihr Projekt und finden Sie heraus, welche Dateien zweimal verwendet werden, und entfernen Sie eine oder löschen Sie alle Dateien und fügen Sie sie erneut hinzu.

Fehler in meinem Xcode:

: 0: Fehler: Dateiname "AttributedString.swift" wird zweimal verwendet: '/Users/.../CNJOB/CNJOB/AttributedString.swift' und '/Users/.../CNJOB/CNJOB/AttributedString.swift'

: 0: Hinweis: Dateinamen werden verwendet, um private Deklarationen mit demselben Namen zu unterscheiden

: 0: Fehler: Dateiname "APIClient.swift" wird zweimal verwendet: '/Users/.../CNJOB/CNJOB/APIClient.swift' und '/Users/.../CNJOB/CNJOB/APIClient.swift'

: 0: Hinweis: Dateinamen werden verwendet, um private Deklarationen mit demselben Namen zu unterscheiden

Befehl / Anwendungen / Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc ist mit Exit-Code 1 fehlgeschlagen

JNYJ
quelle
8

In Xcode 7 können Sie im Debug-Navigator auf den Fehler klicken, und es wird eine erweiterte Ansicht der Abstürze angezeigt. Durch Klicken auf die Hamburger-Schaltfläche rechts wird der Fehler erweitert. Wenn Sie bis zum Ende der erweiterten Fehlermeldung scrollen, sehen Sie, woher er stammt.

Geben Sie hier die Bildbeschreibung ein

Für mich hatte ich zwei dieser Segmentierungsfehler. Im obigen Bild sieht das erste so aus, wenn es zusammengeklappt ist, das zweite, wenn Sie den Hamburger-Knopf erweitern. Ganz unten in der erweiterten grauen Box sehen Sie eine Meldung, in der angegeben ist, wo der Compiler abgestürzt ist.

Beachten Sie jedoch, dass die Fehlermeldung manchmal nicht informativ genug ist. Sie zeigt Ihnen zwar an, wo sie abgestürzt ist, sagt aber nicht immer, warum und wie sie behoben werden kann. Die Beseitigung dieses Fehlers ist immer noch eine Frage der Vermutung.

Matthew Quiros
quelle
1
Konnte die Fehler aus dem Navigator aufspüren. Danke, das hat mir geholfen, meine Fehler zu beheben!
Vishal Chandran
5

Ich habe eine einfache Problemumgehung gefunden, bis das Problem in einem zukünftigen Xcode / Swift-Build behoben ist:

  • Platzieren Sie einfach alle Erweiterungen, die das Problem verursachen, in der .swiftDatei, die verwendet wird.

Platzieren Sie in dem von Ihnen bereitgestellten Beispielprojekt den Inhalt von UIViewExtension.swift und CALayerExtension.swift darüber AppDelegate.swift

Hoffentlich können wir so funktionierenden Swift-Code schreiben , bis das Problem behoben ist.

Gomollon
quelle
4

Was mich betrifft private, füge ich dem statischen var einen festen Clang-Absturz hinzu:

private static var taskId = 0
Vgl
quelle
2

Ich hatte einen Compilersegmentierungsfehler bei einer Anweisung wie dieser:

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

Ich habe stattdessen nur eine if-else-Anweisung gemacht und es funktioniert.

Pojo
quelle
1
Swift 3: Diese Antwort löst den Segmentierungsfehler 11 in vielen Projekten.
Alessandro Ornano
Wow, unglaublich. Der Swift-Compiler fühlt sich mit all diesen Problemen wie eine Alpha-Version an. Danke dafür.
TGO
2

Dieses Problem kann auch auftreten, wenn Sie eine Bedingung mit einem entpackten Bool als Eigenschaft deklarieren

Beninho85
quelle
1

In meinem Fall hat ein falsch platzierter Doppelpunkt während der String-Interpolation meinen gebrochen (XCode 6.1.1).

Beispiel:

println("\(value1:value2)") 

als ich vorhatte zu tun:

println("\(value1) : \(value2)")
jimejim
quelle
1

Dieser Fehler ist mir passiert, als ich versucht habe, eine schwache Variable aus der übergeordneten Klasse zu überschreiben.

In der Basisklasse:

weak var stripeViewDelegate : StripeViewDelegate? = nil    

Abgeleitete Klasse:

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

    }

Der Fehler verschwand, als ich ihn =nilaus der abgeleiteten Klasse entfernte.

VojtaStavik
quelle
1

Ich habe heute eine Ausnahme

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

und das löste es:

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

Da "Any" -Typ ein beliebiges Typereignis "nil", "AnyObject" ist, optional, ... :) Es kann nicht optional sein, es ist bereits optional.

typealias Any = protocol<>
suquant
quelle
Mein Fall war auch ein Problem mit "Any"
Adriano Spadoni
1

Dieser Fehler tritt auch auf, wenn Sie versehentlich eine Variable mit einem Typ deklarieren, der ihrem Namen entspricht:

    var sectionGroup: sectionGroup? { ... }
Saukwood
quelle
Was kein Problem gewesen wäre, wenn Sie die Namenskonvention von Apple befolgt und einen ersten Großbuchstaben für den Typ verwendet hätten. Welches ist wahrscheinlich, warum Apple nicht darüber gestolpert ist. Ferner scheint Ihre Antwort die gleiche zu sein wie die von @aminhotob
qwerty_so
1

Ist auf diesen Fehler aufgrund eines fremden generischen Typs für eine Operatorfunktion gestoßen, z

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

In meinem Fall wurde <T>das Problem durch Entfernen behoben.

Sonne
quelle
Das gleiche Problem hier, im Allgemeinen scheint es, dass das Definieren von Generika, die nicht tatsächlich verwendet werden, diesen Fehler verursacht.
Kevin R
1

In meinem Fall hatte ich ein structInside a deklariert func. Verschieben derstruct auf Klassenebene löste das Problem.

Jetzt, wo ich das schreibe, erinnere ich mich, dass ich zuvor Probleme mit structInside funcS hatte. Es war etwas anderes als der Segmentierungsfehler (der mit der Beta von Swift 1.2 berüchtigt zu werden scheint). OMG Apple, was machst du da?

qwerty_so
quelle
Ich hatte 3 Variablen in einer Struktur und es hat gut funktioniert. Das Hinzufügen einer vierten hat das Problem mit dem Segmentierungsfehler verursacht. Die Änderung der Struktur in Klasse löste es für mich
Ehab Amer
1

In meinem Fall dieser Fehler, weil ich den Klassennamen für die Variable verwende

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

Und das behebt mein Problem

var myClass : MYClass {
    get {
        return.....
    }
}
Aminhotob
quelle
1

In meinem Fall geschah dies, als ich eine falsche statische Initialisierung in einem Protokoll durchführte. Ich habe einen Weg gefunden, um herumzukommen, aber ein Compiler sollte beim Erstellen niemals einen Segmentierungsfehler erzeugen.

Es sind drei Dateien beteiligt. Ein Protokoll namens NamedSegues.swift, ein benutzerdefinierter TableViewController, der unter anderem das Protokoll implementiert, das einen Rückruf enthält, eine benutzerdefinierte TableViewCell, die auf dieses Protokoll verweist, um den Rückruf aufzurufen.

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

Ich habe es umgangen, indem ich?

In der Protokolldatei Datei1: Löschen Sie die Deklaration von getDefault (). In der CustomController-Datei2: Löschen Sie die Implementierung von getDefault. In CustomCellView, Datei3:

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

Der Compiler sollte dies abgefangen und eine Fehlermeldung ausgegeben haben, anstatt während des Builds einen Segmentierungsfehler auszulösen!

Jitendra Kulkarni
quelle
1

Scheint, als wäre der Swift 2-Compiler möglicherweise nicht ganz bereit für die Hauptsendezeit! Falls dies jemandem hilft, wurde ein Segmentierungsfehler angezeigt: 11 aufgrund einer Nichtübereinstimmung mit dem Variablentyp in einem Abschlussheader, insbesondere in einer Parse-Methode,PFQuery.query.findObjectsInBackgroundWithBlock .

Sie können das Problem hier genauer sehen: https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/280

Craig Grummitt
quelle
1

Wie @Fjohn sagte, war dies ein Problem im Zusammenhang mit dem Auspacken eines optionalen für mich (brach sowohl in Xcode 7.0 Beta 6 als auch in Xcode 7 ein). In meinem Fall habe ich nicht optional das optionale ausgepackt (was mich darauf hingewiesen hat, war doppelt ?? im Deskriptor. Verwenden von if let, um das Problem zu lösen

doppelt optional verursacht Segmentierungsfehler

mike.tihonchik
quelle
1

Wie andere oben geschrieben haben, geschah dies für mich, wenn ich eine Erweiterung über ein Protokoll verwende, die Signatur der Methoden im Protokoll jedoch nicht mit den Implementierungen in einer Erweiterung übereinstimmt.

In meinem Fall hatte ich der Implementierung (in der Erweiterung) einen neuen Parameter hinzugefügt, aber vergessen, ihn auch zur Signatur der Methode im Protokoll hinzuzufügen.

Alex
quelle
1

In meinem Fall habe ich versucht, einen Funktionsparameter nach einem variadischen Parameter hinzuzufügen.

Durch Umkehren der Parametersequenz und Festlegen des variadischen Parameters zum letzten Parameter in der Parameterliste wurde dies behoben.

Gerd Castan
quelle
1

Dies geschieht normalerweise, wenn der Compiler (trotz Ihrer Meinung) nicht über genügend Informationen verfügt, um den Status einer Anweisung oder einer Variablen innerhalb einer Anweisung zu garantieren / zu bestimmen.

Stellen Sie sich beispielsweise vor, Sie haben ein Wörterbuch vom Typ [String: String], das Sie mit Städtenamen als Schlüssel und einer durch Kommas getrennten Liste der entsprechenden Postleitzahlen / Postleitzahlen füllen.

Stellen Sie sich vor, Sie möchten irgendwo in Ihrem Code die Liste der entsprechenden Codes aktualisieren:

myDict[town] += newZipCode + ","

In diesem Fall antwortet der Compiler mit einem Segmentierungsfehler, der townmöglicherweise nicht im Wörterbuch enthalten ist, und kann daher nicht garantieren, dass die obige Anweisung einen gültigen Wert hat.

Um dies zu beheben, sollten Sie den aktuellen Status von myDict[town]in einer separaten Variablen speichern , damit Sie den Fall von behandeln key not in dictund dann den Wert für den angegebenen Schlüssel aktualisieren können:

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

Leider ist es nicht immer einfach, die Grundursache zu bestimmen, daher hoffe ich, dass dieses einfache Beispiel hilft.

zevij
quelle
1

Swift 3.0 (Xcode 8.1) weist dieses Problem auf, wenn ein Protokoll eine optionale Variable deklariert und ein Implementierer diese Variable als verzögert initialisierte Variable implementiert.

Fehler wird hier gemeldet: https://bugs.swift.org/browse/SR-1825

Petter
quelle
1

Xcode 8.2.

Hinzufügen der @nonobjcProtokollimplementierung zur Erweiterung, die Segmentierungsfehler verursacht. Verschieben Sie die @nonobjcProtokollimplementierung in die Klassenimplementierung.

Eugene Prokoshev
quelle
1

In meinem Fall hat der Täter versehentlich eine Funktion überladen, die ein Array- Argument mit einem Argument mit einem variadischen Argument erwartet :

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

Als die Oberklasse es als Array definiert hatte:

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

Für mich hat Folgendes einen Segfault verursacht, während dies typeoptional ist:

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

und das löste es:

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

Ich habe diesen Fehler mit der folgenden Methodensignatur in einem benutzerdefinierten UITableViewController erhalten.

func filterContentForSearchText(searchText: String)

Wechsel zu:

func filterContentForSearchText(searchText: String!)

Das Problem wurde behoben.

elprl
quelle
0

Ich hatte das gleiche Problem in einer Erweiterung. Meine Erweiterung hatte zwei praktische Initialisierer:

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

Um den Fehler zu beseitigen, habe ich eine Instanzmethodenzuordnung (Wörterbuch: NSDictionary) hinzugefügt, und der Segmentierungsfehler ist verschwunden.

convenience init(dictionary: NSDictionary, context: NSManagedObjectContext) {
    self.init(context: context)
    map(dictionary)
}
Julian J. Tejera
quelle
0

Für mich bestand das Problem darin, dass meine Architekturen nicht dem Standard entsprachen. Ich hatte i386 oder so hinzugefügt, habe es einfach auf den Standard-xcodeproject-Bogen zurückgesetzt und es wurde gut kompiliert.

Albert Renshaw
quelle
0

Ich hatte das gleiche Problem in einem schnellen Projekt. Das Problem war eine Funktion, die ein Objekt hätte zurückgeben sollen, aber keine Rückgabe enthielt. Diese Art von Fehler wurde früher beim Bearbeiten mit Obj-C signalisiert. Es scheint, dass dies in Swift nicht der Fall ist.

Benjamin
quelle