Kesalahan segmentasi kompilator cepat saat membangun

101

Menambahkan heightproperti komputasi (nyaman) ke UIViewdalam UIViewExtension.swiftfile saya menyebabkan kompilator Swift menjadi segfault ... Apa yang mungkin salah di sini?

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

Jika informasi lebih lanjut diperlukan untuk memecahkan ini, cukup beri komentar. Terima kasih!

Edit:

Berikut ini .xcodeproj terkait yang mengembalikan kesalahan penyusun pertanyaan ini. Unduh disini

aleclarson.dll
sumber
7
kompiler seharusnya tidak segfault. jika ini adalah masalah baru, ajukan laporan bug.
Karoly Horvath
3
Sepertinya bug kompilator. Anda harus melaporkannya ke Apple agar mereka dapat menyelesaikannya.
Chuck
11
Kompiler telah melakukan segfault ke kiri dan kanan karena saya telah memigrasi proyek Objective-C ke Swift. Sangat mengecewakan untuk sedikitnya.
aleclarson
1
@aleclarson Saya berasumsi bahwa versi rilis akan bekerja lebih baik, tetapi jika Anda menemukan bug, saya akan melaporkannya karena itu mungkin satu-satunya cara mereka akan diperbaiki sebelum rilis.
Joachim Isaksson
6
Saya berharap berpikir Swift akan siap untuk digunakan langsung dari pintu gerbang. Menunggu menyebalkan! :)
aleclarson

Jawaban:

75

Saya mengalami kesalahan ini karena saya melakukan ini:

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

}

dari pada

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

}

jadi saya pikir opsional tidak dibuka jika kondisi dapat menyebabkan kesalahan ini

Fjohn
sumber
3
Itu juga penyebabnya bagi saya. Tapi itu seharusnya benar kan? Ini hanya bug kompilator saja
DeFrenZ
Sama. Pemeriksaan enum opsional. Semoga mereka memperbaikinya
mente
Kode yang benar adalah: if (currentMeal.State == .Deleted) {} ​​as Swift membantu overloads == untuk dua pilihan yang sama. Posting Fjohn cukup berbahaya.
mattyohe
1
Ini tentang kesalahan kompilasi, kode yang saya lewati berbahaya jika variabel tidak diverifikasi sebelumnya. bagaimana dengan kode Anda jika currentMeal nihil? itu sama bukan? bisakah Anda menjelaskan mengapa kode saya lebih berbahaya daripada milik Anda? cepat memanfaatkan opsional tanpa menggunakan "?" ?
Fjohn
Terima kasih, ini kasus saya juga. Swift telah memberi saya kejutan yang tidak menyenangkan selama ini, tetapi yang ini jauh melampaui batas.
CodeBrew
26

Saat Anda menemukan kompiler segfault di Swift, Anda tidak mendapatkan nomor baris dan pesan kesalahan yang berguna. Inilah cara Anda melacak masalahnya:

  1. Buat file baru bernama SegFaultDebugger.swiftdalam proyek Anda.
  2. Dalam file baru ini, tentukan ekstensi ke kelas yang memberi Anda masalah.
  3. Pindahkan sekelompok metode dari file utama ke SegFaultDebugger.swift.
  4. Menyusun.

Pada titik ini, salah satu dari tiga hal terjadi:

  • Anda masih mendapatkan segfault di file asli : Pindahkan metode dari SegFaultDebugger.swiftkembali ke file asli dan pindahkan kumpulan metode yang berbeda ke dalamnya SegFaultDebugger.swift. Ulang
  • Anda mendapatkan segfault diSegFaultDebugger.swift : Hebat! Sekarang gunakan pencarian biner untuk menyematkan segfault ke metode tertentu sampai Anda dapat mengetahui konstruksi apa yang menyebabkannya.
  • Anda mendapatkan kesalahan kompiler yang berarti : Bagus! Perbaiki kesalahannya. Setelah semuanya terkompilasi, pindahkan metode Anda kembali ke file asli.
Tagihan
sumber
1
Terima kasih! Ini membantu setelah berjam-jam menggaruk kepalaku.
dejavu89
1
Ini sangat berguna! Dalam kasus saya, saya memiliki NSFetchedResultsControllerDelegate saya dalam sebuah ekstensi dan itu cukup untuk menggabungkannya kembali ke blok kelas utama.
Mikael Grön
@ MikaelGrön - dapatkah Anda mengembangkannya? Apa sebenarnya yang Anda miliki di ekstensi?
RyanJM
Tapi bagaimana Anda tahu kelas mana yang memberi Anda masalah?
Pendeta
@theReverend Jika tidak yakin, Anda harus mencoba setiap kelas dalam file yang melanggar. Tetapi swiftc tidak benar-benar memiliki masalah segfault dalam beberapa tahun - bahkan tidak yakin jawaban saya relevan lagi.
Tagihan
12

Saya mendapat kesalahan ini saat memperluas salah satu protokol saya dan argumen tipe salah ketik dan opsional.

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

    func someProtocolFunction(someProtocolVariable: String)
}

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

Perbedaan argumen fungsi Stringdalam prototipe dan String?ekstensi menyebabkan Kesalahan Segmentasi 11 .

victor.vasilica
sumber
3
Saya punya ini juga. Sepertinya Apple mengalami beberapa masalah dengan pengetikan opsional mereka. Salah satu masalah utama adalah kapan! digunakan di dalam tipe variabel. Ini non-opsional secara default, tetapi kompilator menjadi bingung.
pengguna1122069
@ user1122069 setuju, protokol masih memiliki beberapa masalah. Harapan dengan versi berikutnya masalah ini akan diperbaiki.
victor.vasilica
Saya tidak berbicara tentang protokol, hanya secara umum. Saya baru saja belajar apa! tidak di dalam variabel, tetapi IDE dan compiler sering gagal mendapatkan error yang akurat untuk!.
pengguna1122069
@ user1122069 saya buruk, sry.
victor.vasilica
Ini terjadi pada saya saat menambahkan banyak item dalam sebuah array
aguilarpgc
9

Saya mengalami kesalahan ini juga, dan saya memperbaikinya seperti ini:

Periksa proyek Anda dan cari tahu file mana yang digunakan dua kali dan hapus satu, atau hapus dan tambahkan kembali semuanya.

Kesalahan dalam Xcode saya:

: 0: error: nama file "AttributedString.swift" digunakan dua kali: '/Users/.../CNJOB/CNJOB/AttributedString.swift' dan '/Users/.../CNJOB/CNJOB/AttributedString.swift'

: 0: note: nama file digunakan untuk membedakan deklarasi pribadi dengan nama yang sama

: 0: error: nama file "APIClient.swift" digunakan dua kali: '/Users/.../CNJOB/CNJOB/APIClient.swift' dan '/Users/.../CNJOB/CNJOB/APIClient.swift'

: 0: note: nama file digunakan untuk membedakan deklarasi pribadi dengan nama yang sama

Command / Applications / Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc gagal dengan kode keluar 1

JNYJ
sumber
8

Di Xcode 7, Anda dapat mengklik kesalahan di Debug Navigator dan Anda akan diperlihatkan tampilan crash yang diperluas. Mengklik tombol hamburger di sebelah kanan akan memperluas kesalahan, dan jika Anda menggulir ke bawah ke bagian bawah pesan kesalahan yang diperluas, Anda akan melihat dari mana asalnya.

masukkan deskripsi gambar di sini

Bagi saya, saya mengalami dua kesalahan kesalahan segmentasi tersebut. Pada gambar di atas, yang pertama adalah tampilannya saat diciutkan, yang kedua adalah saat Anda meluaskan tombol hamburger. Di bagian paling bawah kotak abu-abu yang diperluas, Anda akan melihat pesan yang mengatakan di mana kompilator rusak.

Namun perlu dicatat bahwa pesan kesalahan kadang-kadang mungkin tidak cukup informatif, jadi meskipun ia memberi tahu Anda di mana ia macet, itu tidak selalu mengatakan mengapa dan bagaimana memperbaikinya. Menyingkirkan kesalahan ini masih merupakan masalah tebakan.

MLQ
sumber
1
Mampu melacak kesalahan dari Navigator. Terima kasih, ini membantu saya memperbaiki kesalahan saya!
Vishal Chandran
5

Saya telah menemukan solusi sederhana hingga masalahnya diperbaiki di Xcode / Swift build di masa mendatang:

  • Cukup tempatkan semua ekstensi yang menyebabkan masalah di .swiftfile yang sedang digunakan.

Dalam proyek contoh yang Anda berikan, tempatkan konten UIViewExtension.swift dan di CALayerExtension.swift atasnya AppDelegate.swift

Mudah-mudahan ini bisa membuat kita menulis kode Swift yang berfungsi sampai masalah teratasi.

gomollon.dll
sumber
4

Bagi saya, menambahkan privateke clang crash var statis:

private static var taskId = 0
Cfr
sumber
2

Saya mengalami kesalahan segmentasi kompiler pada pernyataan seperti ini:

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

Saya hanya melakukan pernyataan jika-lain dan berhasil.

pojo
sumber
1
Swift 3: jawaban ini memecahkan kesalahan segmentasi 11 di banyak proyek.
Alessandro Ornano
Wow, luar biasa. Kompiler Swift terasa seperti versi alfa dengan semua masalah ini. Terima kasih untuk ini.
TGO
2

Anda juga dapat mengalami masalah ini jika Anda mendeklarasikan kondisi dengan Bool yang tidak dibungkus sebagai properti

Beninho85
sumber
1

Dalam kasus saya, titik dua yang salah tempat selama interpolasi string merusak milik saya (XCode 6.1.1).

Contoh:

println("\(value1:value2)") 

ketika saya bermaksud untuk melakukan:

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

Kesalahan ini terjadi pada saya ketika saya mencoba menimpa variabel lemah dari kelas induk.

Di kelas dasar:

weak var stripeViewDelegate : StripeViewDelegate? = nil    

Kelas turunan:

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

    }

Kesalahan hilang ketika saya menghapus =nildari kelas turunan.

VojtaStavik
sumber
1

Saya menangkap beberapa pengecualian hari ini

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

dan ini menyelesaikannya:

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

Karena tipe "Any" adalah semua tipe event "nil", "AnyObject", opsional, ... :) Ini tidak bisa opsional, itu sudah opsional.

typealias Any = protocol<>
cukup
sumber
Kasus saya juga masalah dengan "Apa saja"
Adriano Spadoni
1

Kesalahan ini juga terjadi jika Anda secara tidak sengaja mendeklarasikan variabel dengan tipe yang cocok dengan namanya:

    var sectionGroup: sectionGroup? { ... }
Saukwood
sumber
Yang tidak akan menjadi masalah jika Anda mengikuti konvensi penamaan Apple dan menggunakan huruf besar pertama untuk jenisnya. Mungkin itulah sebabnya Apple tidak tersandung karenanya. Lebih lanjut, jawaban Anda terlihat sama dengan @aminhotob
qwerty_so
1

Mengalami kesalahan ini karena tipe generik asing pada fungsi operator, misalnya

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

Dalam kasus saya, menghapus <T>menyelesaikan masalah.

Matahari
sumber
Masalah yang sama di sini, secara umum tampaknya mendefinisikan obat generik yang sebenarnya tidak digunakan akan menyebabkan kesalahan ini.
Kevin R
1

Dalam kasus saya, saya telah menyatakan bagian structdalam a func. Pindah structke tingkat kelas memecahkan masalah.

Sekarang saya menulis ini, saya ingat pernah memiliki masalah dengan structinside funcs sebelumnya. Itu adalah sesuatu yang lain dari kesalahan segmentasi (yang tampaknya menjadi terkenal dengan Swift 1.2 beta). OMG Apple, apa yang kamu lakukan disana?

qwerty_so
sumber
Saya memiliki 3 variabel dalam sebuah struct dan berfungsi dengan baik, menambahkan yang keempat mulai menyebabkan masalah kesalahan segmentasi. mengubah struct ke kelas memecahkannya untuk saya
Ehab Amer
1

Dalam kasus saya, kesalahan ini karena saya menggunakan nama Kelas untuk variabel

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

Dan ini memperbaiki masalah saya

var myClass : MYClass {
    get {
        return.....
    }
}
aminhotob.dll
sumber
1

Saya kasus saya, ini terjadi ketika saya melakukan inisialisasi statis yang salah dalam protokol. Saya menemukan cara untuk menyiasati, tetapi kompiler seharusnya tidak pernah menghasilkan kesalahan segmentasi saat membangun.

Ada tiga file yang terlibat. Protokol NamedSegues.swift, TableViewController khusus yang antara lain mengimplementasikan protokol yang berisi callback, TableViewCell khusus yang menyimpan referensi ke protokol ini untuk memanggil callback.

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

Saya menyiasatinya dengan menggunakan?

Di file protokol, file1: hapus deklarasi getDefault () Dalam CustomController file2: hapus implementasi getDefault. Di CustomCellView, file3:

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

Kompilator seharusnya menangkap ini dan memberikan beberapa pesan kesalahan daripada melemparkan kesalahan segmentasi selama pembuatan!

Jitendra Kulkarni
sumber
1

Sepertinya kompiler Swift 2 mungkin belum cukup siap untuk prime-time! Dalam hal ini membantu siapa pun, saya mendapatkan kesalahan segmentasi: 11 karena ketidakcocokan dengan tipe variabel di header penutupan, khususnya dalam metode Parse , PFQuery.query.findObjectsInBackgroundWithBlock.

Anda dapat melihat masalah tersebut lebih detail di sini: https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/280

Craig Grummitt
sumber
1

Seperti yang dikatakan @Fjohn , ini adalah masalah yang terkait dengan membuka bungkus opsional bagi saya (rusak di Xcode 7.0 beta 6 dan Xcode 7). Dalam kasus saya, saya tidak membuka bungkus opsional dari opsional (apa yang memberi tahu saya adalah dua kali lipat ?? dalam deskriptor. Menggunakan jika biarkan memecahkan masalah

opsional ganda menyebabkan kesalahan segmentasi

mike.tihonchik
sumber
1

Seperti yang ditulis orang lain di atas, bagi saya ini terjadi ketika saya menggunakan ekstensi melalui protokol tetapi tanda tangan metode dalam protokol tidak cocok dengan implementasi dalam ekstensi.

Dalam kasus saya, saya telah menambahkan parameter baru ke implementasi (dalam ekstensi) tetapi lupa juga menambahkannya ke tanda tangan metode dalam protokol.

Alex
sumber
1

dalam kasus saya, saya mencoba menambahkan parameter fungsi setelah parameter variadic.

Membalik urutan parameter dan menjadikan parameter variadic sebagai parameter terakhir dalam daftar parameter memperbaikinya.

Gerd Castan
sumber
1

Ini biasanya terjadi ketika kompilator tidak memiliki cukup informasi (terlepas dari apa yang Anda pikirkan) untuk menjamin / menentukan status pernyataan atau variabel dalam pernyataan.

Misalnya, bayangkan Anda memiliki kamus berjenis [String: String] yang Anda isi dengan nama kota sebagai kunci dan daftar kode pos / kode pos terkait yang dipisahkan koma.

Bayangkan bahwa di suatu tempat di kode Anda, Anda ingin memperbarui daftar kode yang sesuai:

myDict[town] += newZipCode + ","

Dalam kasus ini, kompilator akan merespon dengan kesalahan segmentasi karena townmungkin tidak ada dalam kamus dan oleh karena itu tidak dapat menjamin bahwa pernyataan di atas akan memiliki nilai yang valid.

Untuk mengatasi hal ini, Anda harus menyimpan status saat ini myDict[town]dalam variabel terpisah yang memungkinkan Anda menangani kasus key not in dictdan kemudian memperbarui nilai untuk kunci yang diberikan:

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

Sayangnya, tidak selalu mudah untuk menentukan akar masalahnya, jadi saya harap contoh sederhana ini bisa membantu.

zevij
sumber
1

Swift 3.0 (Xcode 8.1) menunjukkan masalah ini ketika protokol mendeklarasikan variabel opsional, dan pelaksana mengimplementasikan variabel tersebut sebagai variabel yang diinisialisasi dengan lambat.

Bug dilaporkan di sini: https://bugs.swift.org/browse/SR-1825

Petter
sumber
1

Xcode 8.2.

Menambahkan @nonobjcimplementasi protokol ke dalam ekstensi menyebabkan kesalahan segmentasi. Pindahkan @nonobjcimplementasi protokol ke dalam implementasi kelas.

Eugene Prokoshev
sumber
1

Dalam kasus saya, pelakunya secara tidak sengaja membebani fungsi yang mengharapkan argumen array dengan argumen variadic :

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

Ketika superclass mendefinisikannya sebagai sebuah array:

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

Bagi saya hal berikut menyebabkan segfault sementara typeadalah opsional:

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

dan ini menyelesaikannya:

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

Saya mendapat kesalahan ini dengan tanda tangan metode berikut di UITableViewController kustom.

func filterContentForSearchText(searchText: String)

berubah menjadi:

func filterContentForSearchText(searchText: String!)

memperbaiki masalah.

elprl
sumber
0

Saya memiliki masalah yang sama dalam perpanjangan waktu. Ekstensi saya memiliki dua penginisialisasi kemudahan:

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

Untuk menghilangkan kesalahan saya menambahkan peta metode contoh (kamus: NSDictionary) dan kesalahan kesalahan segmentasi menghilang.

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

Bagi saya masalahnya adalah arsitektur saya tidak diatur ke standar. Saya telah menambahkan i386 atau sesuatu, cukup setel kembali ke arch xcodeproject default dan itu dikompilasi dengan baik.

Albert Renshaw
sumber
0

Saya memiliki masalah yang sama dalam proyek cepat. Masalahnya adalah fungsi yang seharusnya mengembalikan objek, tetapi tidak memiliki pengembalian di dalamnya. Jenis kesalahan ini biasanya ditandai saat mengedit dengan Obj-C. Sepertinya tidak demikian halnya di Swift.

Benjamin
sumber