Ошибка сегментации компилятора Swift при сборке

101

Добавление (удобного) вычисляемого heightсвойства UIViewв мой UIViewExtension.swiftфайл приводит к сбою компилятора 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

 

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, который возвращает ошибку компилятора этого вопроса. Скачать здесь

Aleclarson
источник
7
компиляторы не должны segfault. если это новая проблема, отправьте отчет об ошибке.
Karoly Horvath
3
Похоже на ошибку компилятора. Вы должны сообщить об этом в Apple, чтобы они разобрались.
Чак
11
Компилятор сегментировал влево и вправо, когда я переносил проект Objective-C на Swift. Это, мягко говоря, обидно.
aleclarson
1
@aleclarson Я предполагаю, что окончательная версия будет работать лучше, но если вы обнаружите ошибки, я сообщу о них, поскольку это может быть единственным способом их исправления до выпуска.
Joachim Isaksson
6
Я надеялся, что Свифт будет готов к использованию сразу после выхода из ворот. Ожидание - отстой! :)
aleclarson

Ответы:

75

У меня была эта ошибка, потому что я делал это:

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

}

вместо того

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

}

поэтому я думаю, что необязательный, не развернутый, если условие может вызвать эту ошибку

Fjohn
источник
3
Это было причиной и для меня. Но ведь это должно было быть правильным? Это всего лишь ошибка компилятора
DeFrenZ
Тем же. Необязательная проверка перечисления. Надеюсь, они это исправят
Mente
Правильный код: if (currentMeal.State == .Deleted) {}, поскольку Swift услужливо перегружает == для двух эквивалентных опций. Сообщение Фджона довольно опасно.
mattyohe
1
Речь идет об ошибке компиляции, код, который я пропустил, опасен, если переменная не проверена раньше. как насчет вашего кода, если currentMeal равен нулю? это же нет? не могли бы вы объяснить мне, почему мой код более опасен, чем ваш? быстро воспользоваться необязательным без использования "?" ?
Fjohn
Спасибо, это тоже мой случай. Swift все время преподносил мне неприятные сюрпризы, но этот - далеко за предел.
CodeBrew
26

Когда вы сталкиваетесь с ошибкой компилятора в Swift, вы не получаете удобный номер строки и сообщение об ошибке. Вот как можно отследить проблему:

  1. Создайте новый файл с именем SegFaultDebugger.swiftв вашем проекте.
  2. В этом новом файле определите расширение класса, вызывающего проблемы.
  3. Переместите группу методов из основного файла в SegFaultDebugger.swift.
  4. Скомпилировать.

В этот момент происходит одно из трех:

  • Вы по-прежнему получаете segfault в исходном файле : переместите методы SegFaultDebugger.swiftобратно в исходный файл и переместите в него другой набор методов SegFaultDebugger.swift. Повторение
  • Вы получаете ошибкуSegFaultDebugger.swift : Отлично! Теперь используйте двоичный поиск, чтобы привязать segfault к определенному методу, пока вы не сможете выяснить, какая конструкция вызывает его.
  • Вы получаете значимые ошибки компилятора : Отлично! Исправьте ошибки. После того, как все скомпилировано, переместите свои методы обратно в исходный файл.
Билл
источник
1
Спасибо! Это помогло после того, как я много часов почесал голову.
dejavu89
1
Это было очень полезно! В моем случае у меня был NSFetchedResultsControllerDelegate в расширении, и этого было достаточно, чтобы объединить его с основным блоком класса.
Mikael Grön
@ MikaelGrön - не могли бы вы рассказать об этом подробнее? Что именно у вас было в расширении?
RyanJM
Но как узнать, какой класс вызывает у вас проблемы?
Преподобный
@theReverend Если вы не уверены, вам придется попробовать каждый класс в файле-нарушителе. Но у swiftc действительно не было проблемы с segfault за несколько лет - не уверен, что мой ответ вообще актуален.
Bill
12

Я получил эту ошибку при расширении одного из моих протоколов и опечатки и необязательного аргумента типа.

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 .

victor.vasilica
источник
3
Я тоже получил это. Похоже, у Apple есть проблемы с дополнительным набором текста. Одна из основных проблем - когда! используется внутри типа переменной. По умолчанию это необязательно, но компилятор запутывается.
user1122069
@ user1122069 согласен, с протоколами остались некоторые проблемы. Надеюсь, в следующих версиях эти проблемы будут исправлены.
victor.vasilica
Я не говорил о протоколах, просто в целом. Я только что узнал что! внутри переменной, но IDE и компилятор часто не могут получить точные ошибки для!.
user1122069
@ user1122069 мой плохой, извините.
victor.vasilica
Это случилось со мной при добавлении большого количества элементов в массив
aguilarpgc 09
9

У меня тоже была эта ошибка, и я исправил ее так:

Проверьте свой проект и выясните, какие файлы используются дважды, и удалите один или удалите и снова добавьте их все.

Ошибки в моем Xcode:

: 0: ошибка: имя файла "AttributedString.swift" использовано дважды: '/Users/.../CNJOB/CNJOB/AttributedString.swift' и '/Users/.../CNJOB/CNJOB/AttributedString.swift'

: 0: примечание: имена файлов используются для различения частных объявлений с тем же именем

: 0: ошибка: имя файла "APIClient.swift" используется дважды: '/Users/.../CNJOB/CNJOB/APIClient.swift' и '/Users/.../CNJOB/CNJOB/APIClient.swift'

: 0: примечание: имена файлов используются для различения частных объявлений с тем же именем

Команда / Applications / Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc не удалось с кодом выхода 1

JNYJ
источник
8

В Xcode 7 вы можете щелкнуть ошибку в навигаторе отладки, и вам будет показан расширенный вид сбоев. Щелчок по кнопке гамбургера справа раскрывает сообщение об ошибке, и если вы прокрутите его до конца раскрытого сообщения об ошибке, вы увидите, откуда оно взялось.

введите описание изображения здесь

Для меня у меня было две из этих ошибок сегментации. На картинке выше первый - это то, как он выглядит в свернутом виде, а второй - когда вы раскрываете кнопку гамбургера. В самом низу развернутого серого поля вы увидите сообщение о том, где произошел сбой компилятора.

Однако обратите внимание, что сообщение об ошибке иногда может быть недостаточно информативным, поэтому, хотя оно сообщает вам, где произошел сбой, оно не всегда говорит, почему и как это исправить. Как избавиться от этой ошибки, все еще остается только догадываться.

MLQ
источник
1
Удалось отследить ошибки из навигатора. Спасибо, это помогло мне исправить мои ошибки!
Вишал Чандран,
5

Я нашел простой обходной путь, пока проблема не будет исправлена ​​в будущей сборке Xcode / Swift:

  • Просто поместите все расширения, вызывающие проблему, в используемый .swiftфайл.

В предоставленном вами примере проекта разместите содержимое UIViewExtension.swift и CALayerExtension.swift выше AppDelegate.swift

Надеюсь, это поможет нам написать рабочий код Swift, пока проблема не будет устранена.

гомоллон
источник
4

Как по мне, добавление privateв static var фиксированного сбоя clang:

private static var taskId = 0
CFR
источник
2

У меня была ошибка сегментации компилятора в таком заявлении:

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

Вместо этого я просто сделал оператор if-else, и он работает.

Pojo
источник
1
Swift 3: этот ответ решает проблему сегментации 11 во многих проектах.
Алессандро Орнано
Вау, невероятно. Компилятор Swift выглядит как альфа-версия со всеми этими проблемами. Спасибо тебе за это.
TGO
2

У вас также может возникнуть эта проблема, если вы объявите условие с развернутым Bool в качестве свойства

Бениньо85
источник
1

В моем случае неуместное двоеточие во время интерполяции строк сломало мой (XCode 6.1.1).

Пример:

println("\(value1:value2)") 

когда я хотел сделать:

println("\(value1) : \(value2)")
Джимеджим
источник
1

Эта ошибка произошла со мной, когда я попытался переопределить слабую переменную из родительского класса.

В базовом классе:

weak var stripeViewDelegate : StripeViewDelegate? = nil    

Производный класс:

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

    }

Ошибка исчезла, когда я удалил =nilиз производного класса.

ВойтаСтавик
источник
1

Сегодня я ловлю какое-то исключение

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

и это решило это:

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

Потому что тип "Any" - это событие любого типа "nil", "AnyObject", optional, ... :) Это не может быть необязательным, это уже необязательно.

typealias Any = protocol<>
Suquant
источник
В моем случае также была проблема с «Any»
Адриано Спадони
1

Эта ошибка возникает также, если вы случайно объявляете переменную, тип которой соответствует ее имени:

    var sectionGroup: sectionGroup? { ... }
Saukwood
источник
Что не было бы проблемой, если бы вы следовали соглашению об именах Apple и использовали первую заглавную букву для типа. Вероятно, поэтому Apple не споткнулась об этом. Далее ваш ответ выглядит таким же, как и у @aminhotob
qwerty_so
1

Возникла эта ошибка из-за постороннего универсального типа в операторной функции, например

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

В моем случае удаление <T>решило проблему.

солнце
источник
Здесь та же проблема, в целом кажется, что определение дженериков, которые фактически не используются, вызовет эту ошибку.
Kevin R
1

В моем случае я объявил structвнутри a func. Переход на structуровень класса решил проблему.

Теперь, когда я это пишу, я помню, что раньше у меня были проблемы с structвнутри funcs. Это было нечто иное, чем ошибка сегментации (которая, похоже, стала печально известной в бета-версии Swift 1.2). OMG Apple, что ты там делаешь?

qwerty_so
источник
У меня было 3 переменных в структуре, и она работала нормально, добавление 4-й начало вызывать проблему с ошибкой сегментации. изменение структуры на класс решило эту проблему для меня
Эхаб Амер
1

В моем случае это ошибка, потому что я использую имя класса для переменной

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

И это решает мою проблему

var myClass : MYClass {
    get {
        return.....
    }
}
aminhotob
источник
1

В моем случае это произошло, когда я выполнил неправильную статическую инициализацию в протоколе. Я нашел способ обойти, но компилятор никогда не должен вызывать ошибку сегментации при сборке.

Здесь задействованы три файла. Протокол 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 () В файле CustomController2: удалите реализацию getDefault. В CustomCellView file3:

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

Компилятор должен был уловить это и выдать сообщение об ошибке вместо того, чтобы выдавать ошибку сегментации во время сборки!

Джитендра Кулкарни
источник
1

Похоже, компилятор Swift 2 еще не совсем готов к работе! В случае , если это помогает любому, я получаю ошибку сегментации: 11 из - за несоответствия с типом переменной в заголовке закрытия, в частности , в методе разбора PFQuery.query.findObjectsInBackgroundWithBlock.

Вы можете увидеть проблему более подробно здесь: https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/280

Крэйг Груммитт
источник
1

Как сказал @Fjohn , это была проблема, связанная с разворачиванием необязательного для меня (сломано как в Xcode 7.0 beta 6, так и в Xcode 7). В моем случае я не разворачивал необязательный из необязательного (то, что меня предупредило, было двойным ?? в дескрипторе. Использование if let решило проблему

двойной необязательный, вызывающий ошибку сегментации

Майк.тихончик
источник
1

Как писали другие выше, для меня это произошло, когда я использую расширение по протоколу, но сигнатуры методов в протоколе не соответствуют реализациям в расширении.

В моем случае я добавил в реализацию (в расширении) новый параметр, но забыл также добавить его в подпись метода в протоколе.

Alex
источник
1

в моем случае я попытался добавить параметр функции после параметра с переменным числом аргументов.

Изменение последовательности параметров на противоположное и установка вариативного параметра последним параметром в списке параметров исправили его.

Герд Кастан
источник
1

Обычно это происходит, когда компилятор не имеет достаточно информации (несмотря на то, что вы думаете), чтобы гарантировать / определить состояние оператора или переменной внутри оператора.

Например, представьте, что у вас есть словарь типа [String: String], который вы заполняете названиями городов в качестве ключей и списком соответствующих почтовых индексов / почтовых индексов, разделенных запятыми.

Представьте, что где-то в вашем коде вы хотите обновить список соответствующих кодов:

myDict[town] += newZipCode + ","

В этом случае компилятор ответит с ошибкой сегментации, которой townможет не быть в словаре, и поэтому он не может гарантировать, что приведенный выше оператор будет иметь допустимое значение.

Чтобы решить эту проблему, вы должны сохранить текущее состояние myDict[town]в отдельной переменной, что позволит вам обрабатывать случай, key not in dictа затем обновить значение для данного ключа:

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

К сожалению, не всегда просто определить основную причину, поэтому я надеюсь, что этот простой пример поможет.

зевий
источник
1

Swift 3.0 (Xcode 8.1) демонстрирует эту проблему, когда протокол объявляет необязательную переменную, а разработчик реализует эту переменную как ленивую инициализированную.

Об ошибке сообщается здесь: https://bugs.swift.org/browse/SR-1825.

Петтер
источник
1

Xcode 8.2.

Добавление @nonobjcреализации протокола в расширение, вызывающее ошибки сегментации. Перенести @nonobjcреализацию протокола в реализацию класса.

Евгений Прокошев
источник
1

В моем случае виновником была случайная перегрузка функции, ожидающей аргумента массива, с аргументом с переменным аргументом:

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

Когда суперкласс определил его как массив:

public required init(_ args: [Node]) {
}
devios1
источник
0

Для меня следующее вызвало segfault, хотя typeэто необязательно:

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

и это решило это:

switch type {
    case .Some(.aType):
        // Do Something
    default:
        break
}
блэкджек
источник
0

Я получил эту ошибку со следующей подписью метода в пользовательском UITableViewController.

func filterContentForSearchText(searchText: String)

меняется на:

func filterContentForSearchText(searchText: String!)

исправил проблему.

elprl
источник
0

У меня была такая же проблема с расширением. У моего расширения было два удобных инициализатора:

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)
}
Джулиан Дж. Техера
источник
0

Для меня проблема заключалась в том, что моя архитектура не соответствовала стандарту. Я добавил i386 или что-то в этом роде, просто вернул его к арке xcodeproject по умолчанию, и он компилировался нормально.

Альберт Реншоу
источник
0

У меня была такая же проблема в быстром проекте. Проблема заключалась в функции, которая должна была вернуть объект, но не имела возврата. Раньше об ошибках такого рода сообщалось при редактировании с помощью Obj-C. Похоже, что в Swift это не так.

Бенджамин
источник