Derleme sırasında hızlı derleyici segmentasyon hatası


101

Bir (elverişli) bilgisayarlı Ekleme heightmülkü UIViewbenim de UIViewExtension.swiftsegfault Swift derleyici neden olan dosyanın ... muhtemelen yanlış burada ne gidiyor olabilir?

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

Bunu çözmek için daha fazla bilgiye ihtiyaç duyulursa, yorum yapmanız yeterlidir. Teşekkürler!

Düzenle:

İşte bu sorunun derleyici hatasını döndüren ilgili bir .xcodeproj. Buradan indirin


7
derleyiciler segfault olmamalıdır. Bu yeni bir sorunsa, bir hata raporu oluşturun.
Karoly Horvath

3
Derleyici hatasına benziyor. Sorunu çözebilmeleri için Apple'a bildirmelisiniz.
Chuck

11
Ben bir Objective-C projesini Swift'e geçirirken derleyici sola ve sağa ayrılıyor. En azını söylemek cesaret kırıcı.
aleclarson

1
@aleclarson Yayın sürümünün daha iyi çalışacağını varsayıyorum, ancak hata bulursanız, bunları bildiririm çünkü bu, sürümden önce düzeltilmelerinin tek yolu olabilir.
Joachim Isaksson

6
Swift'in kapıdan çıkar çıkmaz kullanıma hazır olacağını düşünüyordum. Beklemek berbat! :)
aleclarson

Yanıtlar:


75

Bu hatayı aldım çünkü bunu yapıyordum:

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

}

onun yerine

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

}

bu yüzden, eğer koşul bu hataya neden olabilirse isteğe bağlı sarmalanmamış olduğunu düşünüyorum


3
Benim için de sebep buydu. Ama bunun doğru olması gerekiyordu değil mi? Sadece bir derleyici hatası o
DeFrenZ

Aynı. İsteğe bağlı numaralandırma denetimi. Umarım düzeltirler
mente

Doğru kod şudur: if (currentMeal.State == .Deleted) {}, Swift, eşitlenebilir iki seçenek için yararlı bir şekilde == aşırı yükler. Fjohn'un gönderisi oldukça tehlikelidir.
mattyohe

1
Bir derleme hatasıyla ilgili, geçtiğim kod, değişken daha önce doğrulanmadıysa tehlikelidir. currentMeal sıfırsa kodunuz ne olacak? aynı değil mi? bana kodumun neden seninkinden daha tehlikeli olduğunu açıklayabilir misin lütfen? hızlı "?" kullanmadan isteğe bağlı avantajlardan yararlanın ?
Fjohn

Teşekkürler, bu benim de davam. Swift bana yol boyunca hoş olmayan sürprizler yaşattı, ama bu sınırın çok üzerinde.
CodeBrew

26

Swift'de bir derleyici segfault ile karşılaştığınızda, kullanışlı bir satır numarası ve hata mesajı almazsınız. Sorunu şu şekilde takip edebilirsiniz:

  1. SegFaultDebugger.swiftProjenizde çağrılan yeni bir dosya oluşturun .
  2. Bu yeni dosyada, size sorun veren sınıf için bir uzantı tanımlayın.
  3. Ana dosyadan bir yöntem grubunu SegFaultDebugger.swift.
  4. Derleyin.

Bu noktada, üç şeyden biri gerçekleşir:

  • Segfault'u hala orijinal dosyada alıyorsunuz : YöntemleriSegFaultDebugger.swift eski dosyadan orijinal dosyaya taşıyın ve içine farklı bir yöntem kümesini taşıyın SegFaultDebugger.swift. Tekrar et
  • Bir segfault elde edersiniz SegFaultDebugger.swift : Harika! Şimdi segfault'u belirli bir yönteme sabitlemek için, hangi yapının buna neden olduğunu bulana kadar ikili aramayı kullanın.
  • Anlamlı derleyici hataları alıyorsunuz : Harika! Hataları düzeltin. Her şey derlendiğinde, yöntemlerinizi orijinal dosyaya geri taşıyın.

1
Teşekkürler! Bu, saatlerce başımı kaşıdıktan sonra yardımcı oldu.
dejavu89

1
Bu çok faydalı oldu! Benim durumumda, NSFetchedResultsControllerDelegate'im bir uzantıya sahipti ve bunu ana sınıf bloğuna geri birleştirmek yeterliydi.
Mikael Grön

@ MikaelGrön - bunu genişletebilir misin? Uzantıda tam olarak ne vardı?
RyanJM

Ama hangi sınıfın size sorunları verdiğini nasıl anlarsınız?
The Reverend

@theReverend Emin değilseniz, rahatsız edici dosyadaki her sınıfı denemeniz gerekir. Ancak swiftc birkaç yıl içinde gerçekten bir segfault sorunu yaşamadı - cevabımın artık alakalı olduğundan bile emin değilim.
Bill

12

Bu hatayı protokollerimden birini ve yanlış yazılmış ve isteğe bağlı tür bağımsız değişkenini genişletirken aldım.

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

    func someProtocolFunction(someProtocolVariable: String)
}

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

StringPrototipteki ve String?uzantıdaki işlev bağımsız değişkenlerindeki farklılık Segmentasyon Hatası 11'e neden oldu .


3
Bunu ben de aldım. Görünüşe göre Apple'ın isteğe bağlı yazımıyla ilgili bazı sorunları var. Önemli bir sorun ne zaman! değişken bir tür içinde kullanılır. Varsayılan olarak isteğe bağlı değildir, ancak derleyicinin kafası karışır.
user1122069

@ user1122069 katılıyorum, protokollerin bazı sorunları var. Umarım sonraki sürümlerde bu sorunlar çözülür.
victor.vasilica

Protokollerden bahsetmiyordum, sadece genel olarak. Az önce ne öğrendim! bir değişkenin içinde yapar, ancak IDE ve derleyici genellikle!.
user1122069

@ user1122069 benim hatam, sry.
victor.vasilica

Bir diziye çok sayıda öğe eklerken bu bana oldu
aguilarpgc

9

Ben de bu hatayı aldım ve şu şekilde düzelttim:

Projenizi kontrol edin ve hangi dosyaların iki kez kullanıldığını bulun ve birini kaldırın veya hepsini silip yeniden ekleyin.

Xcode'umdaki hatalar:

: 0: hata: dosya adı "AttributedString.swift" iki kez kullanıldı: '/Users/.../CNJOB/CNJOB/AttributedString.swift' ve '/Users/.../CNJOB/CNJOB/AttributedString.swift'

: 0: not: dosya adları, aynı ada sahip özel bildirimleri ayırt etmek için kullanılır

: 0: hata: "APIClient.swift" dosya adı iki kez kullanıldı: '/Users/.../CNJOB/CNJOB/APIClient.swift' ve '/Users/.../CNJOB/CNJOB/APIClient.swift'

: 0: not: dosya adları, aynı ada sahip özel bildirimleri ayırt etmek için kullanılır

Command / Applications / Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc, çıkış kodu 1 ile başarısız oldu


8

Xcode 7'de, Hata Ayıklama Gezgini'ndeki hataya tıklayabilirsiniz ve çökmelerin genişletilmiş bir görünümü gösterilir. Sağdaki hamburger düğmesine tıklamak hatayı genişletir ve genişletilmiş hata mesajının sonuna kadar aşağıya inerseniz, nereden geldiğini görürsünüz.

görüntü açıklamasını buraya girin

Benim için, bu bölümleme hatası hatalarından iki tanesine sahiptim. Yukarıdaki resimde birincisi daraldığında nasıl göründüğü, ikincisi ise hamburger düğmesini açtığınız zamandır. Genişletilmiş gri kutunun en altında, derleyicinin nerede çöktüğünü belirten bir mesaj göreceksiniz.

Bununla birlikte, hata mesajının bazen yeterince bilgilendirici olmayabileceğini unutmayın, bu nedenle size nerede düştüğünü söylerken, her zaman neden ve nasıl düzeltileceğini söylemiyor. Bu hatadan kurtulmak hala bir tahmin meselesidir.


1
Navigator'dan hataları takip edebildi. Teşekkürler, bu hatalarımı düzeltmeme yardımcı oldu!
Vishal Chandran

5

Gelecekteki bir Xcode / Swift yapısında sorun çözülene kadar basit bir geçici çözüm keşfettim:

  • Soruna neden olan tüm uzantıları .swift, kullanıldığı dosyaya yerleştirmeniz yeterlidir .

Sağladığınız örnek projede, içeriğini UIViewExtension.swift ve CALayerExtension.swift üstünü yerleştirin AppDelegate.swift

Umarım bu , sorun çözülene kadar çalışan Swift kodu yazmamızı sağlayabilir.


4

Bana gelince, privatestatik var sabit clang çökmesine ek olarak:

private static var taskId = 0

2

Böyle bir ifadede derleyici segmentasyon hatası yaşadım:

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

Onun yerine bir if-else ifadesi yaptım ve işe yarıyor.


1
Swift 3: Bu cevap, birçok projedeki segmentatio hatası 11'i çözüyor.
Alessandro Ornano

Vay canına, inanılmaz. Swift derleyicisi, tüm bu sorunları içeren bir alfa sürümü gibi hissediyor. Bunun için teşekkür ederim.
TGO

2

Özellik olarak sarmalanmamış bir Bool içeren bir koşul bildirirseniz de bu sorunu yaşayabilirsiniz.


1

Benim durumumda, dizi enterpolasyonu sırasında yanlış yerleştirilmiş bir kolon benimkini kırdı (XCode 6.1.1).

Misal:

println("\(value1:value2)") 

yapmak istediğimde:

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

1

Bu hata, ana sınıftan zayıf değişkeni geçersiz kılmaya çalıştığımda başıma geldi.

Temel sınıfta:

weak var stripeViewDelegate : StripeViewDelegate? = nil    

Türetilmiş sınıf:

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

    }

=nilTüretilmiş sınıftan kaldırdığımda hata ortadan kalktı .


1

Bugün bazı istisnalar yakaladım

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

ve bu sorunu çözdü:

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

"Herhangi" tür herhangi bir tür olay olduğundan "nil", "AnyObject", isteğe bağlı, ... :) İsteğe bağlı olamaz, zaten isteğe bağlıdır.

typealias Any = protocol<>

Benim durumum da "Herhangi Biri" ile ilgili bir sorundu
Adriano Spadoni

1

Bu hata, yanlışlıkla adı ile eşleşen bir türe sahip bir değişken bildirdiğinizde de oluşur:

    var sectionGroup: sectionGroup? { ... }

Apple'ın adlandırma kuralını takip edip tür için ilk büyük harf kullansaydınız bu sorun olmazdı. Muhtemelen Apple bu konuda tökezlemedi. Ayrıca cevabınız @aminhotob ile aynı görünüyor
qwerty_so

1

Bir operatör işlevindeki gereksiz genel türden dolayı bu hatayla karşılaştı, ör.

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

Benim durumumda, kaldırmak <T>sorunu çözdü.


Burada da aynı sorun, genel olarak gerçekte kullanılmayan jeneriklerin tanımlanması bu hataya neden olacak gibi görünüyor.
Kevin R.

1

Benim durumumda bir structiç a beyan etmiştim func. Taşınmastruct sınıf düzeyine sorunu çözdü.

Şimdi bunu yazdığıma göre, daha önce structfuncöğelerle ilgili sorunlar yaşadığımı hatırlıyorum . Segmentasyon hatasından başka bir şeydi (Swift 1.2 beta ile kötü bir şöhrete sahip görünüyor). OMG Apple, orada ne yapıyorsun?


Bir yapıda 3 değişkenim vardı ve iyi çalıştı, 4. bir bölümleme hatası sorununa neden olmaya başladı. yapıyı sınıfa çevirmek sorunu benim için çözdü
Ehab Amer

1

Benim durumumda, değişken için Sınıf adını kullandığım için bu hata

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

Ve bu benim sorunumu çözüyor

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

1

Ben benim durumum, bu bir protokolde yanlış statik başlatma yaptığımda oldu. Etrafta dolaşmanın bir yolunu buldum, ancak bir derleyici derleme sırasında asla bir bölümleme hatası üretmemelidir.

İlgili üç dosya var. NamedSegues.swift protokolü, diğer şeylerin yanı sıra geri aramayı içeren protokolü uygulayan özel bir TableViewController, geri aramayı çağırmak için bu protokole başvuruyu tutan özel bir 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.
     }
}

Kullanarak dolaştım?

Protokol dosyasında, dosya1: getDefault () bildirimini silin CustomController dosya2'de: getDefault uygulamasını silin. CustomCellView'da dosya3:

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

Derleyici bunu yakalamalı ve derleme sırasında bir bölümleme hatası atmak yerine bazı hata mesajları vermelidir!


1

Görünüşe göre Swift 2 derleyicisi prime-time için tam olarak hazır değilmiş! Bunun herhangi birine yardımcı olması durumunda, bir bölümleme hatası alıyordum: 11, özellikle bir Parse yönteminde, bir kapatma başlığındaki değişken türü ile uyumsuzluk nedeniyle PFQuery.query.findObjectsInBackgroundWithBlock.

Sorunu burada daha ayrıntılı olarak görebilirsiniz: https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/280


1

Gibi @Fjohn söyledi, bu (her iki Xcode 7.0 beta 6 ve Xcode 7 kırdı) benim için isteğe bağlı bir unwrapping ilgili bir sorun oldu. Benim durumumda, isteğe bağlı isteğe bağlı olanı açmıyordum (tanımlayıcıda beni ikiye katlayan şeydi. If let'in kullanılması sorunu çözdü

bölümleme hatasına neden olan çift isteğe bağlı


1

Başkalarının yukarıda yazdığı gibi, benim için bu, bir protokol üzerinden bir uzantı kullandığımda oldu, ancak protokoldeki yöntemlerin imzası bir uzantıdaki uygulamalarla eşleşmiyor.

Benim durumumda, uygulamaya (uzantıda) yeni bir parametre ekledim, ancak bunu protokoldeki yöntemin imzasına da eklemeyi unuttum.


1

benim durumumda, bir variadic parametreden sonra bir fonksiyon parametresi eklemeye çalıştım.

Parametre sırasını ters çevirmek ve variadic parametresini parametre listesindeki son parametre yapmak, onu sabitledi.


1

Bu genellikle derleyicinin bir ifadenin veya bir ifadedeki bir değişkenin durumunu garanti etmek / belirlemek için yeterli bilgiye sahip olmadığı durumlarda (sizin ne düşündüğünüze rağmen) olur.

Örneğin, anahtar olarak şehir adlarıyla doldurduğunuz [Dize: Dize] türünde bir sözlüğünüz ve karşılık gelen posta kodları / posta kodlarının virgülle ayrılmış bir listesi olduğunu hayal edin.

Kodunuzun bir yerinde ilgili kodların listesini güncellemek istediğinizi düşünün:

myDict[town] += newZipCode + ","

Bu durumda, derleyici townsözlükte olmadığı gibi bölümleme hatasıyla yanıt verir ve bu nedenle yukarıdaki ifadenin geçerli bir değere sahip olacağını garanti edemez.

Bunu çözmek için, 'nin mevcut durumunu myDict[town]ayrı bir değişkende saklamanız gerekir; bu, durumu ele almanıza key not in dictve ardından verilen anahtarın değerini güncellemenize olanak tanır :

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

Maalesef, temel nedeni belirlemek her zaman kolay değildir, bu nedenle bu basit örneğin yardımcı olacağını umuyorum.


1

Swift 3.0 (Xcode 8.1), bir protokol isteğe bağlı bir değişken bildirdiğinde ve bir uygulayıcı bu değişkeni tembel başlatılmış bir değişken olarak uyguladığında bu sorunu gösterir.

Hata burada bildirilir: https://bugs.swift.org/browse/SR-1825


1

Xcode 8.2.

Uzantıya @nonobjcprotokol uygulaması eklenmesi, segmentasyon hatalarına neden olur. @nonobjcProtokol uygulamasını sınıf uygulamasına taşıyın .


1

Benim durumumda, suçlu, değişken bir argüman içeren bir dizi argümanı bekleyen bir işlevi yanlışlıkla aşırı yüklüyordu :

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

Üst sınıf bunu bir dizi olarak tanımladığında:

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

0

Benim için type, isteğe bağlı iken aşağıdaki bir segfault'a neden oldu :

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

ve bu sorunu çözdü:

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

0

Özel bir UITableViewController'da aşağıdaki yöntem imzasıyla bu hatayı aldım.

func filterContentForSearchText(searchText: String)

değişiyor:

func filterContentForSearchText(searchText: String!)

sorunu çözdü.


0

Bir uzantıda aynı sorunu yaşadım. Uzantımın iki kolaylık başlatıcısı vardı:

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

Hatadan kurtulmak için bir örnek yöntem haritası ekledim (sözlük: NSDictionary) ve segmentasyon hatası hatası ortadan kalktı.

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

0

Benim için sorun, mimarilerimin standartlara ayarlanmamasıydı. İ386 veya başka bir şey ekledim, sadece varsayılan xcodeproject arch'e geri ayarladım ve iyi derlendi.


0

Hızlı bir projede aynı sorunu yaşadım. Sorun, bir nesne döndürmesi gereken, ancak içinde dönüşü olmayan bir işlevdi. Bu tür bir hata, Obj-C ile düzenleme yapılırken bildirilirdi. Swift'de durum böyle değil gibi görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.