Ошибка сегментации компилятора Swift при построении
Добавление (удобного) вычисленного значения height
в UIView
в моем файле UIViewExtension.swift
приводит к UIView
компилятора 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::addClassMembers(swift::ClassDecl*) + 329 6 swift 0x00000001055e97b2 swift::irgen::emitVirtualMethodValue(swift::irgen::IRGenFunction&, llvm::Value*, swift::SILType, swift::SILDeclRef, swift::CanTypeWrapper, swift::ResilienceExpansion) + 434 7 swift 0x00000001056550d3 swift::SILVisitor::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*, void*) + 4842 13 swift 0x00000001055a935d main + 1533 14 libdyld.dylib 0x00007fff8a82e5fd start + 1
1. While emitting IR SIL function @_TFCSo6UIViewg6heightSd for 'anonname=0x7ff422892fd0' at /UIViewExtension.swift:60:5 :0: error: unable to execute command: Segmentation fault: 11 :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, который возвращает ошибку компилятора этого вопроса. Скачать здесь
- Как использовать NSToolBar в Xcode 6 и Storyboard?
- Как отобразить индикатор активности с текстом на iOS 8 с помощью Swift?
- Как создать локальные области в Swift?
- Первые имена параметров Swift 3
- В чем разница между `let` и` var` в swift?
- Сохранение значений в завершенииHandlers - Swift
- Определение, если словарь Swift содержит ключ и получает какие-либо его значения
- Могу ли я иметь файлы Swift, Objective-C, C и C ++ в одном и том же проекте Xcode?
- filterArrayUsingPredicate не существует в быстром массиве
- metadata.downloadURL () больше не распознается?
- Как преобразовать десятичное число в двоичный файл в Swift?
- Как вы используете соответствующий class цветов для текущей платформы?
- Модуль, скомпилированный с помощью swift 3.0, не может быть импортирован в Swift 3.0.1
У меня была эта ошибка, потому что я делал это:
if(currentMeal?.State == .Deleted){ }
вместо
if(currentMeal!.State == .Deleted){ }
поэтому я думаю, что необязательно не распаковано, если условие может вызвать эту ошибку
Когда вы запускаете segfault компилятора в Swift, вы не получаете удобный номер строки и сообщение об ошибке. Вот как вы можете отслеживать проблему:
- Создайте в своем проекте новый файл
SegFaultDebugger.swift
. - В этом новом файле определите расширение для classа, который дает вам проблемы.
- Переместите группу методов из основного файла в
SegFaultDebugger.swift
. - Компиляция.
На данный момент происходит одна из трех вещей:
- Вы по-прежнему получаете segfault в исходном файле : переместите методы из
SegFaultDebugger.swift
обратно в исходный файл и переместите другой набор методов вSegFaultDebugger.swift
. Повторение - Вы получаете segfault в
SegFaultDebugger.swift
: Отлично! Теперь используйте бинарный поиск, чтобы привязать segfault до определенного метода, пока вы не сможете выяснить, какая конструкция вызывает его. - Вы получаете значимые compiler errors : Отлично! Исправьте ошибки. Как только все скомпилируется, переместите свои методы обратно в исходный файл.
Я получил эту ошибку, расширяя один из моих протоколов и ошибочный и необязательный аргумент типа.
protocol SomeProtocolName: class { var someProtocolVariable: String { get set } func someProtocolFunction(someProtocolVariable: String) } // MARK: extension SomeProtocolName { func someProtocolFunction(someProtocolVariable: String?) { self.someProtocolVariable = someProtocolVariable } }
Разница в аргументах функции String
в прототипе и String?
в расширении вызвана segmentation fault 11 .
У меня тоже была эта ошибка, и я исправил ее так:
Проверьте свой проект и выясните, какие файлы используются дважды, и удалите его, или удалите и снова добавьте их.
Ошибки в моем Xcode:
: 0: ошибка: имя файла «AttributedString.swift» используется дважды: «/Users/…/CNJOB/CNJOB/AttributedString.swift» и «/Users/…/CNJOB/CNJOB/AttributedString.swift»
: 0: note: имена файлов используются, чтобы отличать частные объявления с тем же именем
: 0: ошибка: имя файла “APIClient.swift” используется дважды: ‘/Users/…/CNJOB/CNJOB/APIClient.swift’ и ‘/Users/…/CNJOB/CNJOB/APIClient.swift’
: 0: note: имена файлов используются, чтобы отличать частные объявления с тем же именем
Команда / Приложения / Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc не удалось с кодом выхода 1
В Xcode 7 вы можете щелкнуть по ошибке в Debug Navigator, и вам будет показан расширенный вид сбоев. Нажатие на кнопку гамбургера справа расширяет эту ошибку, и если вы прокрутите весь путь до нижней части расширенного сообщения об ошибке, вы увидите, откуда оно взялось.
Для меня у меня были две ошибки ошибок сегментации. На картинке выше, первая – это то, как она выглядит, когда рухнула, вторая – когда вы расширяете кнопку гамбургера. В самом низу расширенного серого windows вы увидите сообщение, в котором говорится, где произошел сбой компилятора.
Обратите внимание, однако, что сообщение об ошибке может время от времени быть недостаточно информативным, поэтому, пока он сообщает вам, где он разбился, он не всегда говорит, почему и как его исправить. Избавиться от этой ошибки все еще очень вопрос догадок.
Я обнаружил простую обходную проблему, пока проблема не будет исправлена в будущей сборке Xcode / Swift:
- Просто разместите все расширения, вызывающие проблему в файле
.swift
который он использует.
В приведенном ниже примере проекта поместите содержимое UIViewExtension.swift
и CALayerExtension.swift
над AppDelegate.swift
Надеюсь, это может заставить нас написать рабочий код Swift до тех пор, пока проблема не будет устранена.
Что касается меня, добавление private
в статический var fixed clang crash:
private static var taskId = 0
У меня была segmentation fault компилятора в следующем утверждении:
someFunction(isFlagged ? "String1" : "String2")
Вместо этого я сделал инструкцию if-else, и она работает.
У вас также может возникнуть эта проблема, если вы объявите условие с развернутым Bool как свойство
В моем случае, некорректный двоеточие во время интерполяции строк разбил мой (XCode 6.1.1).
Пример:
println("\(value1:value2)")
когда я хотел сделать:
println("\(value1) : \(value2)")
Эта ошибка произошла со мной, когда я попытался переопределить слабую переменную из родительского classа.
В базовом classе:
weak var stripeViewDelegate : StripeViewDelegate? = nil
Производный class:
override weak var stripeViewDelegate : StripeViewDelegate? = nil { didSet { self.stripeView.delegate = stripeViewDelegate }
Ошибка исчезла, когда я удалил =nil
из производного classа.
Сегодня я поймаю какое-то исключение
class func createByAny(instance: Any?) -> ApiCollectionResponse { ... }
и это решило это:
class func createByAny(instance: Any) -> ApiCollectionResponse { ... }
Потому что «Любой» тип – это любое событие типа «nil», «AnyObject», необязательный, … 🙂 Он не может быть дополнительным, он уже является необязательным.
typealias Any = protocol<>
Эта ошибка также возникает, если вы случайно объявите переменную с типом, соответствующим его имени:
var sectionGroup: sectionGroup? { ... }
Исправлена эта ошибка из-за постороннего родового типа в операторной функции, например
func ==(lhs: Foo, rhs: Foo) -> Bool { return lhs.bar == rhs.bar }
В моем случае удаление
разрешило проблему.
В моем случае я объявил struct
внутри func
. Перемещение struct
на уровень classа решило проблему.
Теперь, когда я пишу это, я помню, что раньше у меня были проблемы со struct
внутри func
. Это было нечто иное, чем segmentation fault (которая, похоже, стала известной с бета-версией Swift 1.2). OMG Apple, что вы там делаете?
В моем случае эта ошибка, потому что я использую имя classа для переменной
var MYClass : MYClass { get { return..... } }
И это исправляет мою проблему
var myClass : MYClass { get { return..... } }
В моем случае это произошло, когда я сделал неправильную статическую инициализацию в протоколе. Я нашел способ обойти, но компилятор никогда не должен создавать ошибку сегментации при построении.
Есть три файла. Протокол 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, withEvent event: UIEvent) { NSLog("Touched id: \(id)") parent.executeSegueWithId(id) // This is where parent was used. } }
Я обошел его, используя?
В файле протокола file1: удалить объявление getDefault () В файле CustomController file2: удалить реализацию getDefault. В CustomCellView файл3:
var parent: NamedSegues? ... parent?.executeSegueWithId(id)
Компилятор должен был поймать это и дать некоторое сообщение об ошибке вместо того, чтобы бросать ошибку сегментации во время сборки!
Кажется, что компилятор Swift 2, возможно, не был готов к прайм-тайму! Если это кому-то помогает, я получаю ошибку сегментации: 11 из-за несоответствия с типом переменной в заголовке закрытия, в частности, в методе Parse, PFQuery.query.findObjectsInBackgroundWithBlock
.
Вы можете увидеть проблему более подробно здесь: https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/280
Как сказал @Fjohn , это была проблема, связанная с распаковкой дополнительного для меня (сломалась как в Xcode 7.0 beta 6, так и в Xcode 7). В моем случае я не разворачивал необязательный вариант (то, что меня отталкивало, было двойным в дескрипторе. Использование, если бы разрешило проблему
Как я уже писал выше, для меня это произошло, когда я использую расширение по протоколу, но сигнатура методов в протоколе не соответствует реализациям в расширении.
В моем случае я добавил новый параметр к реализации (в расширении), но забыл также добавить его к сигнатуре метода в протоколе.
в моем случае я попытался добавить параметр функции после вариационного параметра.
Повторяя последовательность параметров и делая переменный параметр, последний параметр в списке параметров зафиксировал его.
Обычно это происходит, когда компилятор не имеет достаточной информации (несмотря на то, что вы думаете), чтобы гарантировать / определить состояние оператора или переменной внутри оператора.
Например, представьте, что у вас есть словарь типа [String: String], который вы заполняете названиями городов в качестве ключей и разделенным запятыми списком соответствующих почтовых индексов / почтовых кодов.
Представьте, что где-то в вашем коде вы хотите обновить список соответствующих кодов:
myDict[town] += newZipCode + ","
В этом случае компилятор будет реагировать с ошибкой сегментации, поскольку town
может не быть в словаре, и поэтому он не может гарантировать, что приведенный выше оператор будет иметь действительное значение.
Чтобы решить эту проблему, вы должны сохранить текущее состояние myDict[town]
в отдельной переменной, позволяющей обрабатывать случай key not in dict
а затем обновлять значение для данного ключа:
myDict[town] = guaranteedValue + "," newZipCode + ","
К сожалению, не всегда просто определить основную причину, поэтому я надеюсь, что этот простой пример поможет.
Swift 3.0 (Xcode 8.1) демонстрирует эту проблему, когда протокол объявляет необязательную переменную, а реализация реализует эту переменную как ленивую инициализированную.
Об ошибке сообщается здесь: https://bugs.swift.org/browse/SR-1825
Xcode 8.2.
Добавление @nonobjc
протокола @nonobjc
в расширение, вызывающее ошибки сегментации. Переместить @nonobjc
протокола @nonobjc
реализацию classа.
В моем случае виновник случайно перегрузил функцию, ожидающую аргумент массива с аргументом Variadic :
public required init(_ args: Node...) { }
Когда суперclass был определен как массив:
public required init(_ args: [Node]) { }
Для меня следующее вызвало segfault, в то время как type
является необязательным:
switch type { case .aType: // Do Something default: break }
и это решило это:
switch type { case .Some(.aType): // Do Something default: break }
Я получил эту ошибку со следующей сигнатурой метода в пользовательском UITableViewController.
func filterContentForSearchText(searchText: String)
переход на:
func filterContentForSearchText(searchText: String!)
исправлена проблема.
У меня была такая же проблема в расширении. У моего расширения было два инициализатора удобства:
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) }
Для меня проблема заключалась в том, что мои архитектуры не соответствовали стандарту. Я добавил i386 или что-то в этом роде, просто вернул его в стандартную арку xcodeproject и скомпилировал ее.
У меня была такая же проблема в быстром проекте. Проблема была функцией, которая должна была вернуть объект, но в нем не было возврата. Подобная ошибка использовалась для сообщения с помощью Obj-C. Похоже, что это не так в Свифте.