Помилка сегментації компілятора при будівництві


100

Додавання 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, який повертає помилку компілятора цього питання. Завантажте тут


7
компілятори не повинні бути типовими. якщо це нова проблема, подайте звіт про помилку.
Каролі Хорват

3
Схоже на помилку компілятора. Ви повинні повідомити про це Apple, щоб вони могли розібратися.
Чак

11
Під час міграції проекту Objective-C до Swift компілятор проводив сегментацію ліворуч та праворуч. Як мінімум, це було огидно.
aleclarson

1
@aleclarson Я припускаю, що версія випуску буде працювати краще, але якщо ви знайдете помилки, я повідомив би про них, оскільки це може бути єдиний спосіб їх виправлення до випуску.
Йоахім Ісакссон

6
Я бажав думати, що Свіфт буде готовий використати прямо з воріт. Чекаємо смокче! :)
aleclarson

Відповіді:


75

У мене була ця помилка, оскільки я робив це:

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

}

замість

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

}

тому я думаю, необов’язково не розгортається, якщо умова може спричинити цю помилку


3
Це було причиною і для мене. Але це мало бути правильно? Це лише помилка компілятора
DeFrenZ

Те саме. Необов’язкова перевірка перерахунків. Сподіваюсь, вони це виправлять
men

Правильним кодом було б: якщо (currentMeal.State == .Deleted) {} ​​як Swift корисно перевантажує == для двох необов'язкових, які можна вирівняти. Пост Фьона досить небезпечний.
mattyohe

1
Йдеться про помилку компіляції, код, який я минув, небезпечний, якщо змінна не була перевірена раніше. що з вашим кодом, якщо currentMeal дорівнює нулю? це ж ні? ви можете мені пояснити, чому мій код небезпечніший, ніж ваш, будь ласка? швидко скористайтеся додатковою опцією без використання "?" ?
Фьон

Спасибі, це теж мій випадок. Свіфт подарував мені неприємні сюрпризи по всьому шляху, але це один за межею.
CodeBrew

26

Коли ви зіткнетесь з компілятором, що знаходиться в стандартному сегменті в Swift, ви не отримаєте зручний номер рядка та повідомлення про помилку. Ось як можна відстежити проблему:

  1. Створіть новий файл, названий SegFaultDebugger.swiftу вашому проекті.
  2. У цьому новому файлі визначте розширення до класу, який створює проблеми.
  3. Перемістіть групу методів з головного файлу в SegFaultDebugger.swift.
  4. Складіть.

У цей момент відбувається одне з трьох речей:

  • Ви все ще отримуєте segfault у вихідному файлі : Перемістіть методи SegFaultDebugger.swiftназад до вихідного файлу та перемістіть у інший набір методів SegFaultDebugger.swift. Повторіть
  • Ви отримуєте сегмент за замовчуванням уSegFaultDebugger.swift : Чудово ! Тепер використовуйте двійковий пошук, щоб прив’язати сегментар до конкретного методу, поки ви не зможете з’ясувати, яка конструкція його викликає.
  • Ви отримуєте змістовні помилки компілятора : Чудово! Виправити помилки. Як тільки все компілюється, перенесіть свої методи назад у вихідний файл.

1
Дякую! Це допомогло після годинного дряпання голови.
dejavu89

1
Це було дуже корисно! У моєму випадку я мав свій розширення NSFetchedResultsControllerDelegate, і цього було достатньо для об'єднання цього списку в основний блок класу.
Мікаел Грьон

@ MikaelGrön - чи можете ви розширити це? Що саме у вас було в розширенні?
RyanJM

Але як ти дізнаєшся, до якого класу належить тобі питання?
Преосвященний

@theReverend Якщо ви не впевнені, вам доведеться спробувати кожен клас у файлі, який ображає право. Але swiftc насправді не мав проблеми з сегментацією за кілька років - не впевнений, що моя відповідь вже навіть актуальна.
Білл

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 .


3
Я теж це отримав. Схоже, у Apple є деякі проблеми з їх необов'язковим набором тексту. Одне головне питання - коли! використовується всередині змінного типу. За замовчуванням це необов'язково, але компілятор плутається.
користувач1122069

@ user1122069 згоден, у протоколів залишилися деякі проблеми. Сподіваюся, що з наступними версіями ці проблеми будуть виправлені.
victor.vasilica

Я не говорив про протоколи, просто загалом. Я тільки що дізнався! робить всередині змінної, але IDE і компілятор часто не вдається отримати точні помилки!
користувач1122069

@ user1122069 мій поганий, сирий
victor.vasilica

Це сталося зі мною, коли додавали багато елементів у масив
aguilarpgc

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: Примітка: імена файлів використовуються для розрізнення приватних декларацій з однойменною назвою

Команда / програми / Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc не вдалося з кодом виходу 1


8

У Xcode 7 ви можете натиснути на помилку в Навігаторі налагодження, і вам буде показано розширений вигляд збоїв. Клацання кнопки гамбургер праворуч розширює помилку, і якщо прокрутити весь шлях донизу розгорнутого повідомлення про помилку, ви побачите, звідки воно походить.

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

Для мене у мене були дві з цих помилок сегментації. На малюнку вище, перший - як він виглядає при згортанні, другий - коли ви розгортаєте кнопку омбре. У самому дні розширеного сірого поля ви побачите повідомлення, в якому сказано, де збій компілятора.

Однак зауважте, що повідомлення про помилку часом може бути недостатньо інформативним, тому, хоча воно говорить вам, де воно вийшло з ладу, воно не завжди говорить про те, чому і як його виправити. Позбавлення від цієї помилки все ще є справою здогадів.


1
Вдалося віднайти помилки з Навігатора. Дякую, це допомогло мені виправити мої помилки!
Вішал Чандран

5

Я виявив просте вирішення, поки проблема не буде вирішена в майбутній збірці Xcode / Swift:

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

У прикладі запропонованого вами проекту розмістіть вміст UIViewExtension.swift та CALayerExtension.swift вище AppDelegate.swift

Сподіваємось, це може змусити нас написати робочий код Swift, поки проблема не буде усунена.


4

Як на мене, додаючи privateдо статичної вар фіксованої клангової аварії:

private static var taskId = 0

2

У мене виникла помилка сегментації компілятора у такому операторі:

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

Я просто зробив натомість твердження if-else, і воно працює.


1
Швидкий 3: ця відповідь вирішує помилку сегментації 11 у багатьох проектах.
Алессандро Орнано

Нічого, неймовірного. Компілятор Swift відчуває себе альфа-версією з усіма цими проблемами. Дякую за це.
TGO

2

Ви також можете мати цю проблему, якщо ви оголосите умову з розгорнутим Bool як власність


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

Оскільки тип "Будь-який" - це будь-яка подія типу "нуль", "AnyObject", необов'язково, ... :) Це не може бути необов'язковим, воно вже є необов'язковим.

typealias Any = protocol<>

У моєму випадку також була проблема з "Будь-яким"
Адріано Спадоні

1

Ця помилка трапляється також, якщо ви випадково оголосили змінну з типом, що відповідає її імені:

    var sectionGroup: sectionGroup? { ... }

Що б не було проблемою, якби ви дотримувались конвенції Apple про іменування та використовували першу верхню літеру для цього типу. Що ймовірно, чому Apple не натрапила на це. Далі ваша відповідь виглядає так само, як і в @aminhotob
qwerty_so

1

Натрапили на цю помилку через сторонній загальний тип операторської функції, наприклад

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

У моєму випадку видалення <T>вирішило проблему.


Ця ж проблема тут, загалом здається, що визначення генеричних даних, які насправді не використовуються, спричинить цю помилку.
Кевін Р

1

У моєму випадку я оголосив structусередині себе func. Переміщенняstruct рівень класу вирішив питання.

Тепер, коли я це пишу, я пам'ятаю, що раніше були проблеми з structвнутрішніми funcs. Це було щось інше, ніж помилка сегментації (яка, здається, стала відомою для бета-версії Swift 1.2). OMG Apple, що ти там робиш?


У мене було 3 змінних у структурі, і вона спрацювала чудово, додавши четверту, що почала викликати проблему сегментації. зміна структури на клас вирішила це для мене
Ehab Amer

1

У моєму випадку ця помилка, оскільки я використовую ім'я класу для змінної

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

І це виправляє мою проблему

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

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. У файлі3 CustomCellView, файл 3:

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

Компілятор мав би це зрозуміти і дав повідомлення про помилку замість того, щоб кидати помилку сегментації під час збирання!


1

Схоже, компілятор Swift 2, можливо, не був готовий до прайм-тайму! Якщо це допомагає комусь, я отримував помилку сегментації: 11 через невідповідність типу змінної у заголовку закриття, зокрема методом Parse,PFQuery.query.findObjectsInBackgroundWithBlock .

Ви можете ознайомитись з проблемою детальніше тут: https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/isissue/280


1

Як сказав @Fjohn , це питання, пов’язане з розгортанням необов'язкового для мене (зламався як у Xcode 7.0 beta 6, так і в Xcode 7). У моєму випадку я не розкручував факультативу за вибором (те, що мені підказало, було подвійне в дескрипторі. Використовуючи, якщо дозволяють вирішити проблему

подвійний факультативний виклик сегментації


1

Як писали інші вище, для мене це сталося, коли я використовую розширення на протокол, але підпис методів у протоколі не відповідає реалізаціям у розширенні.

У моєму випадку я додав новий параметр до реалізації (у розширенні), але забув також додати його до підпису методу в протоколі.


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]) {
}

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!)

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


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. Здається, що у Свіфта не так.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.