Błąd segmentacji szybkiego kompilatora podczas kompilowania

101

Dodanie (wygodnej) heightwłaściwości obliczonej do UIVieww moim UIViewExtension.swiftpliku powoduje segfault kompilatora Swift ... Co może tu być nie tak?

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

Jeśli potrzeba więcej informacji, aby to złamać, po prostu skomentuj. Dzięki!

Edytować:

Oto powiązany plik .xcodeproj, który zwraca błąd kompilatora tego pytania. Pobierz tutaj

aleclarson
źródło
7
kompilatory nie powinny segfaultować. jeśli to nowy problem, zgłoś błąd.
Karoly Horvath
3
Wygląda na błąd kompilatora. Powinieneś zgłosić to firmie Apple, aby mogli to rozwiązać.
Chuck,
11
Kompilator segfaultuje w lewo iw prawo, gdy migruję projekt Objective-C do Swift. To było co najmniej przygnębiające.
aleclarson
1
@aleclarson Zakładam, że wydana wersja będzie działać lepiej, ale jeśli znajdziesz błędy, zgłosiłbym je, ponieważ może to być jedyny sposób, w jaki zostaną naprawione przed wydaniem.
Joachim Isaksson
6
Pomyślałem, że Szybki będzie gotowy do użycia zaraz po wyjściu z bramy. Czekanie jest do bani! :)
aleclarson

Odpowiedzi:

75

Miałem ten błąd, ponieważ robiłem to:

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

}

zamiast

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

}

więc myślę, że opcjonalny nie rozpakowany, jeśli stan może spowodować ten błąd

Fjohn
źródło
3
To był powód również dla mnie. Ale to miało być poprawne, prawda? To tylko błąd kompilatora
DeFrenZ
Podobnie. Opcjonalne sprawdzenie wyliczenia. Mam nadzieję, że to naprawią
mente
Prawidłowy kod to: if (currentMeal.State == .Deleted) {} ​​as Swift pomocnie przeciąża == dla dwóch opcji, które są równoważne. Post Fjohna jest dość niebezpieczny.
mattyohe
1
Chodzi o błąd kompilacji, kod, który przeszedłem jest niebezpieczny, jeśli zmienna nie została wcześniej zweryfikowana. a co z twoim kodem, jeśli currentMeal jest zerowy? to jest to samo, nie? czy możesz mi wyjaśnić, dlaczego mój kod jest bardziej niebezpieczny niż twój? szybko skorzystaj z opcji bez użycia „?” ?
Fjohn,
Dzięki, to też moja sprawa. Swift przez cały czas dawał mi nieprzyjemne niespodzianki, ale ta jest znacznie większa.
CodeBrew
26

Kiedy napotkasz segfault kompilatora w Swift, nie otrzymasz przydatnego numeru wiersza i komunikatu o błędzie. Oto, jak możesz wyśledzić problem:

  1. Utwórz nowy plik o nazwie SegFaultDebugger.swiftw swoim projekcie.
  2. W tym nowym pliku zdefiniuj rozszerzenie klasy, które powoduje problemy.
  3. Przenieś grupę metod z pliku głównego do SegFaultDebugger.swift.
  4. Skompilować.

W tym momencie dzieje się jedna z trzech rzeczy:

  • Nadal występuje błąd segfault w oryginalnym pliku : Przenieś metody z SegFaultDebugger.swiftpowrotem do oryginalnego pliku i przenieś inny zestaw metod do SegFaultDebugger.swift. Powtarzać
  • Otrzymujesz segfault wSegFaultDebugger.swift : Świetnie! Teraz użyj wyszukiwania binarnego, aby przypiąć segfault do określonej metody, dopóki nie dowiesz się, jaka konstrukcja ją powoduje.
  • Otrzymujesz znaczące błędy kompilatora : Świetnie! Napraw błędy. Gdy wszystko się skompiluje, przenieś metody z powrotem do oryginalnego pliku.
Rachunek
źródło
1
Dzięki! Pomogło to po godzinach drapania się po głowie.
dejavu89
1
To było bardzo przydatne! W moim przypadku miałem NSFetchedResultsControllerDelegate w rozszerzeniu i wystarczyło scalić go z powrotem do głównego bloku klasy.
Mikael Grön
@ MikaelGrön - czy możesz to rozwinąć? Co dokładnie miałeś w rozszerzeniu?
RyanJM
Ale skąd wiesz, która klasa daje Ci problemy?
wielebny
@theReverend Jeśli nie masz pewności, będziesz musiał wypróbować każdą klasę w pliku zawierającym problem. Ale swiftc tak naprawdę nie miał problemu z segfaultem od kilku lat - nie jestem pewien, czy moja odpowiedź jest już odpowiednia.
Bill
12

Otrzymałem ten błąd podczas rozszerzania jednego z moich protokołów i błędnie wpisanego i opcjonalnego argumentu typu.

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

    func someProtocolFunction(someProtocolVariable: String)
}

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

Różnica w argumentach funkcji Stringw prototypie i String?rozszerzeniu spowodowała błąd segmentacji 11 .

victor.vasilica
źródło
3
Też mam to. Wygląda na to, że Apple ma pewne problemy z ich opcjonalnym pisaniem. Jednym z głównych problemów jest to, kiedy! jest używany wewnątrz typu zmiennej. Domyślnie nie jest opcjonalny, ale kompilator jest zdezorientowany.
user1122069
@ user1122069 zgadzam się, z protokołami pozostały pewne problemy. Mam nadzieję, że w następnych wersjach te problemy zostaną naprawione.
victor.vasilica
Nie mówiłem o protokołach, tylko ogólnie. Właśnie się dowiedziałem, co! robi wewnątrz zmiennej, ale IDE i kompilator często nie mogą uzyskać dokładnych błędów!.
user1122069
@ user1122069 my bad, sry.
victor.vasilica
Zdarzyło mi się to podczas dodawania wielu elementów w tablicy
aguilarpgc
9

Miałem też ten błąd i naprawiłem go w ten sposób:

Sprawdź swój projekt i dowiedz się, które pliki są używane dwukrotnie i usuń jeden lub usuń i ponownie dodaj je wszystkie.

Błędy w moim Xcode:

: 0: error: nazwa pliku "AttributedString.swift" użyte dwukrotnie: '/Users/.../CNJOB/CNJOB/AttributedString.swift' i '/Users/.../CNJOB/CNJOB/AttributedString.swift'

: 0: uwaga: nazwy plików są używane do rozróżniania prywatnych deklaracji o tej samej nazwie

: 0: błąd: nazwa pliku „APIClient.swift” została użyta dwukrotnie: „/Users/.../CNJOB/CNJOB/APIClient.swift” i „/Users/.../CNJOB/CNJOB/APIClient.swift”

: 0: uwaga: nazwy plików są używane do rozróżniania prywatnych deklaracji o tej samej nazwie

Polecenie / Applications / Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc nie powiodło się z kodem zakończenia 1

JNYJ
źródło
8

W Xcode 7 możesz kliknąć błąd w nawigatorze debugowania, a zostanie wyświetlony rozszerzony widok awarii. Kliknięcie przycisku hamburgera po prawej stronie rozwija błąd, a jeśli przewiniesz do samego dołu rozwiniętego komunikatu o błędzie, zobaczysz, skąd on pochodzi.

wprowadź opis obrazu tutaj

U mnie wystąpiły dwa z tych błędów segmentacji. Na powyższym obrazku pierwszy z nich przedstawia to, jak wygląda zwinięty, a drugi to rozwinięcie przycisku hamburgera. Na samym dole rozwiniętego szarego pola zobaczysz komunikat informujący o miejscu awarii kompilatora.

Należy jednak pamiętać, że komunikat o błędzie może czasami nie zawierać wystarczających informacji, więc chociaż informuje o miejscu awarii, nie zawsze wyjaśnia, dlaczego i jak to naprawić. Pozbycie się tego błędu jest nadal w dużej mierze kwestią domysłów.

MLQ
źródło
1
Udało mi się wyśledzić błędy z Nawigatora. Dzięki, pomogło mi to naprawić błędy!
Vishal Chandran
5

Odkryłem proste obejście problemu, dopóki problem nie zostanie rozwiązany w przyszłej kompilacji Xcode / Swift:

  • Po prostu umieść wszystkie rozszerzenia powodujące problem w .swiftużywanym pliku.

W podanym przez Ciebie przykładowym projekcie umieść zawartość UIViewExtension.swift i CALayerExtension.swift powyżej AppDelegate.swift

Mamy nadzieję, że pozwoli nam to napisać działający kod Swift, dopóki problem nie zostanie rozwiązany.

gomollon
źródło
4

Jak dla mnie dodanie privatedo static var fixed clang crash:

private static var taskId = 0
Por
źródło
2

Wystąpił błąd segmentacji kompilatora w oświadczeniu takim:

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

Zamiast tego wykonałem instrukcję if-else i działa.

pojo
źródło
1
Swift 3: ta odpowiedź rozwiązuje błąd segmentacji 11 w wielu projektach.
Alessandro Ornano
Wow, niewiarygodne. Kompilator Swift wygląda jak wersja alfa ze wszystkimi tymi problemami. Dziękuję Ci za to.
TGO
2

Możesz również mieć ten problem, jeśli zadeklarujesz warunek z rozpakowaną wartością Bool jako właściwością

Beninho85
źródło
1

W moim przypadku źle umieszczony dwukropek podczas interpolacji ciągów złamał mój (XCode 6.1.1).

Przykład:

println("\(value1:value2)") 

kiedy miałem zamiar zrobić:

println("\(value1) : \(value2)")
jimejim
źródło
1

Ten błąd przydarzył mi się, gdy próbowałem zastąpić słabą zmienną z klasy nadrzędnej.

W klasie bazowej:

weak var stripeViewDelegate : StripeViewDelegate? = nil    

Klasy pochodnej:

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

    }

Błąd zniknął po usunięciu =nilz klasy pochodnej.

VojtaStavik
źródło
1

Dziś łapię wyjątek

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

i to rozwiązało:

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

Ponieważ typ "Dowolny" jest zdarzeniem dowolnego typu "nil", "AnyObject", opcjonalny, ... :) Nie może być opcjonalny, już jest opcjonalny.

typealias Any = protocol<>
suquant
źródło
Mój przypadek był również problemem z "Any"
Adriano Spadoni
1

Ten błąd występuje również, jeśli przypadkowo zadeklarujesz zmienną o typie pasującym do jej nazwy:

    var sectionGroup: sectionGroup? { ... }
Saukwood
źródło
Co nie byłoby problemem, gdybyś postępował zgodnie z konwencją nazewnictwa Apple i użył pierwszej dużej litery dla typu. I prawdopodobnie dlatego Apple się o to nie potknęło. Co więcej, Twoja odpowiedź wygląda na taką samą, jak w przypadku @aminhotob
qwerty_so,
1

Wystąpił ten błąd z powodu obcego typu ogólnego w funkcji operatora, np

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

W moim przypadku usunięcie <T>rozwiązało problem.

Słońce
źródło
Ten sam problem, generalnie wydaje się, że zdefiniowanie typów generycznych, które nie są faktycznie używane, spowoduje ten błąd.
Kevin R
1

W moim przypadku zadeklarowałem structinside a func. Przenoszeniestruct do poziomu klasy rozwiązało problem.

Teraz, kiedy to piszę, pamiętam, że miałem wcześniej problemy z structwewnętrznymi func. To było coś innego niż błąd segmentacji (który wydaje się być znany z wersji beta Swift 1.2). OMG Apple, co tam robisz?

qwerty_so
źródło
Miałem 3 zmienne w strukturze i działało dobrze, dodanie czwartej zaczęło powodować problem z błędem segmentacji. zmiana struktury na klasę rozwiązała to za mnie
Ehab Amer
1

W moim przypadku ten błąd, ponieważ używam nazwy klasy dla zmiennej

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

I to rozwiązuje mój problem

var myClass : MYClass {
    get {
        return.....
    }
}
aminotob
źródło
1

W moim przypadku stało się to, gdy wykonałem nieprawidłową statyczną inicjalizację w protokole. Znalazłem sposób na obejście tego problemu, ale kompilator nigdy nie powinien generować błędu segmentacji podczas budowania.

W grę wchodzą trzy pliki. Protokół NamedSegues.swift, niestandardowy TableViewController, który między innymi implementuje protokół zawierający wywołanie zwrotne, niestandardową TableViewCell, która zawiera odwołanie do tego protokołu w celu wywołania wywołania zwrotnego.

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

Poradziłem sobie z tym, używając?

W pliku protokołu plik1: usuń deklarację getDefault () W pliku CustomController plik2: usuń implementację getDefault. W CustomCellView plik3:

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

Kompilator powinien był to wychwycić i podać jakiś komunikat o błędzie zamiast zgłaszać błąd segmentacji podczas kompilacji!

Jitendra Kulkarni
źródło
1

Wygląda na to, że kompilator Swift 2 mógł nie być całkiem gotowy na czas największej oglądalności! Na wypadek, gdyby to komukolwiek pomogło, otrzymałem błąd segmentacji: 11 z powodu niezgodności z typem zmiennej w nagłówku zamknięcia, szczególnie w metodzie Parse,PFQuery.query.findObjectsInBackgroundWithBlock .

Możesz zobaczyć problem bardziej szczegółowo tutaj: https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/280

Craig Grummitt
źródło
1

Jak powiedział @Fjohn , był to problem związany z rozpakowywaniem opcjonalnego dla mnie (zepsuł się zarówno w Xcode 7.0 beta 6, jak i Xcode 7). W moim przypadku nie rozpakowałem opcjonalnego elementu opcjonalnego (wskazówka to podwójne ?? w deskryptorze. Używanie if let rozwiązało problem

podwójna opcja powodująca błąd segmentacji

mike.tihonchik
źródło
1

Jak napisali inni powyżej, dla mnie stało się to, gdy używam rozszerzenia zamiast protokołu, ale sygnatura metod w protokole nie jest zgodna z implementacjami w rozszerzeniu.

W moim przypadku dodałem do implementacji nowy parametr (w rozszerzeniu), ale zapomniałem dodać go również do sygnatury metody w protokole.

Alex
źródło
1

w moim przypadku próbowałem dodać parametr funkcji po parametrze wariadycznym.

Odwrócenie sekwencji parametrów i uczynienie parametru wariadycznego ostatnim parametrem na liście parametrów naprawiło ten problem.

Gerd Castan
źródło
1

Dzieje się tak zwykle, gdy kompilator nie ma wystarczających informacji (pomimo tego, co myślisz), aby zagwarantować / określić stan instrukcji lub zmiennej w instrukcji.

Na przykład, wyobraź sobie, że masz słownik typu [String: String], w którym wpisujesz nazwy miast jako klucze i rozdzieloną przecinkami listę odpowiadających im kodów pocztowych / pocztowych.

Wyobraź sobie, że gdzieś w swoim kodzie chcesz zaktualizować listę odpowiednich kodów:

myDict[town] += newZipCode + ","

W takim przypadku kompilator odpowie błędem segmentacji, ponieważ townmoże nie być w słowniku i dlatego nie może zagwarantować, że powyższa instrukcja będzie miała prawidłową wartość.

Aby rozwiązać ten problem, należy zapisać aktualny stan myDict[town]w osobnej zmiennej, co pozwoli obsłużyć przypadek, key not in dicta następnie zaktualizować wartość dla danego klucza:

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

Niestety, nie zawsze łatwo jest określić główną przyczynę, więc mam nadzieję, że ten prosty przykład pomoże.

zevij
źródło
1

Swift 3.0 (Xcode 8.1) wykazuje ten problem, gdy protokół deklaruje opcjonalną zmienną, a implementujący implementuje tę zmienną jako leniwą zainicjowaną.

Zgłoszono błąd tutaj: https://bugs.swift.org/browse/SR-1825

Petter
źródło
1

Xcode 8.2.

Dodanie @nonobjcimplementacji protokołu do rozszerzenia powodującego błędy segmentacji. Przenieś @nonobjcimplementację protokołu do implementacji klasy.

Eugene Prokoshev
źródło
1

W moim przypadku winowajcą było przypadkowe przeciążenie funkcji oczekującej argumentu tablicowego z argumentem wariadycznym :

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

Kiedy nadklasa zdefiniowała ją jako tablicę:

public required init(_ args: [Node]) {
}
devios1
źródło
0

Dla mnie następujące spowodowało segfault, podczas gdy typejest opcjonalne:

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

i to rozwiązało:

switch type {
    case .Some(.aType):
        // Do Something
    default:
        break
}
blackjacx
źródło
0

Otrzymałem ten błąd z następującą sygnaturą metody w niestandardowym UITableViewController.

func filterContentForSearchText(searchText: String)

zmiana na:

func filterContentForSearchText(searchText: String!)

naprawiono problem.

elprl
źródło
0

Miałem ten sam problem w rozszerzeniu. Moje rozszerzenie miało dwa wygodne inicjatory:

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

Aby pozbyć się tego błędu, dodałem mapę metod instancji (słownik: NSDictionary) i zniknął błąd błędu segmentacji.

convenience init(dictionary: NSDictionary, context: NSManagedObjectContext) {
    self.init(context: context)
    map(dictionary)
}
Julian J. Tejera
źródło
0

Dla mnie problemem było to, że moja architektura nie była ustawiona na standard. Dodałem i386 lub coś w tym stylu, po prostu ustawiłem go z powrotem na domyślny arch xcodeproject i skompilowałem się dobrze.

Albert Renshaw
źródło
0

Miałem ten sam problem w szybkim projekcie. Problem polegał na funkcji, która powinna zwrócić obiekt, ale nie miała w nim zwrotu. Ten rodzaj błędu był sygnalizowany podczas edycji w Obj-C. Wygląda na to, że w Swift nie jest.

Benzoes
źródło