빌드시 신속한 컴파일러 세그멘테이션 오류


100

내 파일 에 (편리한) 계산 된 height속성을 추가 하면 Swift 컴파일러가 segfault를 발생합니다. 여기서 무엇이 잘못 될 수 있습니까?UIViewUIViewExtension.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
컴파일러는 segfault를하지 않아야합니다. 새로운 문제인 경우 버그 보고서를 제출하십시오.
Karoly Horvath

3
컴파일러 버그처럼 보입니다. Apple에 신고하여 분류 할 수 있도록해야합니다.
Chuck

11
Objective-C 프로젝트를 Swift로 마이그레이션하면서 컴파일러는 왼쪽과 오른쪽으로 세그 폴팅되었습니다. 아무리 말해도 낙담했습니다.
aleclarson

1
@aleclarson 릴리스 버전이 더 잘 작동한다고 가정하지만 버그를 발견하면 릴리스 전에 수정 될 수있는 유일한 방법 일 수 있으므로보고하겠습니다.
Joachim Isaksson 2014-06-14

6
나는 Swift가 게이트에서 바로 사용할 준비가 될 것이라고 생각하고있었습니다. 기다리는 중이 야! :)
aleclarson 2014-06-14

답변:


75

이 작업을 수행했기 때문에이 오류가 발생했습니다.

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

}

대신에

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

}

그래서 조건 이이 오류를 일으킬 수 있다면 옵션으로 포장을 풀지 않은 것으로 생각합니다.


3
그것은 나에게도 원인이었습니다. 하지만 그게 옳 아야 했죠? 컴파일러 버그
일뿐입니다

같은. 선택적 열거 검사. 그들이 그것을 고치기를
바라 라

올바른 코드는 다음과 같습니다. if (currentMeal.State == .Deleted) {} ​​as Swift는 동등하게 두 개의 옵션에 대해 ==를 유용하게 오버로드합니다. Fjohn의 게시물은 매우 위험합니다.
mattyohe

1
컴파일 오류에 관한 것입니다. 이전에 변수를 확인하지 않은 경우 이전 코드는 위험합니다. currentMeal이 nil이면 코드는 어떻습니까? 똑같아요? 내 코드가 당신 것보다 더 위험한 이유를 설명해 주시겠습니까? 신속하게 "?"를 사용하지 않고 선택 사항을 활용하십시오. ?
Fjohn

고마워요, 이것도 제 경우입니다. 스위프트는 그동안 나에게 불쾌한 놀라움을 선사해 왔지만 이건 한계를 넘어 섰다.
CodeBrew

26

Swift에서 컴파일러 segfault를 실행하면 편리한 줄 번호와 오류 메시지가 표시되지 않습니다. 문제를 추적하는 방법은 다음과 같습니다.

  1. SegFaultDebugger.swift프로젝트에서 라는 새 파일을 만듭니다 .
  2. 이 새 파일에서 문제를 일으키는 클래스의 확장자를 정의하십시오.
  3. 메서드 그룹을 기본 파일에서 SegFaultDebugger.swift.
  4. 엮다.

이 시점에서 다음 세 가지 중 하나가 발생합니다.

  • 여전히 원본 파일에서 segfault를 얻을 수 있습니다 . 방법을 SegFaultDebugger.swift다시 원본 파일로 이동하고 다른 방법 세트를 SegFaultDebugger.swift. 반복
  • 당신은에서 segfault를 얻습니다SegFaultDebugger.swift : 좋습니다 ! 이제 이진 검색을 사용하여 segfault를 특정 방법으로 고정하여 어떤 구조가 원인인지 파악할 수 있습니다.
  • 의미있는 컴파일러 오류가 발생합니다 . 좋습니다! 오류를 수정하십시오. 모든 것이 컴파일되면 메서드를 원래 파일로 다시 이동하십시오.

1
감사! 이것은 내 머리를 긁는 데 몇 시간 후에 도움이되었습니다.
dejavu89

1
이것은 매우 유용했습니다! 제 경우에는 확장에 NSFetchedResultsControllerDelegate가 있었고 주 클래스 블록에 다시 병합하는 것으로 충분했습니다.
미카엘 GRON

@ 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?확장 에서 함수 인수의 차이로 인해 Segmentation Fault 11이 발생했습니다 .


3
나도 알아. Apple에 선택적 입력에 문제가있는 것 같습니다. 한 가지 중요한 문제는! 변수 유형 내에서 사용됩니다. 기본적으로 선택 사항이 아니지만 컴파일러가 혼란스러워집니다.
user1122069

@ user1122069 동의합니다. 프로토콜에 몇 가지 문제가 남아 있습니다. 다음 버전에서이 문제가 해결되기를 바랍니다.
victor.vasilica

일반적으로 프로토콜에 대해 얘기 한 것이 아닙니다. 나는 방금 무엇을 배웠다! 변수 내부에서 수행되지만 IDE 및 컴파일러는 종종!에 대한 정확한 오류를 얻지 못합니다.
user1122069

@ user1122069 내 나쁜, sry.
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 : 참고 : 파일 이름은 동일한 이름의 개인 선언을 구분하는 데 사용됩니다.

/ Applications / Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc 명령이 종료 코드 1로 실패했습니다.


8

Xcode 7에서는 디버그 네비게이터에서 오류를 클릭하면 확장 된 충돌보기가 표시됩니다. 오른쪽에있는 햄버거 버튼을 클릭하면 오류가 확장되고 확장 된 오류 메시지의 맨 아래로 스크롤하면 오류가 발생한 위치를 볼 수 있습니다.

여기에 이미지 설명 입력

저에게는 두 가지 세분화 오류 오류가있었습니다. 위 그림에서 첫 번째는 접었을 때의 모습이고 두 번째는 햄버거 버튼을 펼쳤을 때의 모습입니다. 확장 된 회색 상자의 맨 아래에 컴파일러가 충돌 한 위치를 알려주는 메시지가 표시됩니다.

그러나 오류 메시지는 때때로 정보가 충분하지 않을 수 있으므로 오류가 발생한 위치를 알려 주지만 항상 원인과 해결 방법을 알려주지는 않습니다. 이 오류를 제거하는 것은 여전히 ​​추측의 문제입니다.


1
네비게이터에서 오류를 추적 할 수있었습니다. 감사합니다. 이것은 내 오류를 수정하는 데 도움이되었습니다.
Vishal Chandran 2016 년

5

향후 Xcode / Swift 빌드에서 문제가 해결 될 때까지 간단한 해결 방법을 발견했습니다.

  • 문제를 일으키는 모든 확장자 .swift를 사용중인 파일에 넣으십시오.

제공된 예제 프로젝트에서의 내용 배치 UIViewExtension.swift CALayerExtension.swift AppDelegate.swift

문제가 해결 될 때까지 작동하는 Swift 코드 를 작성할 수 있기를 바랍니다 .


4

나를 private위해 정적 var fixed clang crash에 추가하십시오.

private static var taskId = 0

2

다음과 같은 명령문에 컴파일러 분할 오류가 있습니다.

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

대신 if-else 문을 수행했는데 작동합니다.


1
Swift 3 :이 답변은 많은 프로젝트에서 분할 오류 11을 해결합니다.
알레산드로 Ornano

와, 믿을 수가 없네요. 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 { ... }

"Any"유형은 모든 유형 이벤트 "nil", "AnyObject", 선택 사항, ... :) 선택 사항 일 수 없으며 이미 선택 사항입니다.

typealias Any = protocol<>

내 경우는 "모든"문제였다
아드리아누 Spadoni

1

이 오류는 유형이 이름과 일치하는 변수를 실수로 선언 한 경우에도 발생합니다.

    var sectionGroup: sectionGroup? { ... }

Apple의 명명 규칙을 따르고 유형에 첫 번째 대문자를 사용했다면 문제가되지 않았을 것입니다. 이것이 애플이 우연히 발견하지 못한 이유 일 것입니다. 더 나아가 귀하의 답변은 @aminhotob의 답변과 동일하게 보입니다
qwerty_so

1

연산자 함수에 대한 외부 제네릭 유형 때문에이 오류가 발생했습니다. 예 :

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

제 경우에는 제거 <T>하면 문제가 해결되었습니다.


여기서도 동일한 문제가 발생합니다. 일반적으로 실제로 사용되지 않는 제네릭을 정의하면이 오류가 발생하는 것 같습니다.
케빈 R

1

제 경우 struct에는 func. 이동struct수업 수준으로 문제가 해결되었습니다.

이제 나는 이것을 작성 하기 전에 struct내부에 문제가 있었던 것을 기억 func합니다. 그것은 세그멘테이션 결함 (Swift 1.2 베타에서 악명 높은 것으로 보인다)과는 다른 무언가였습니다. OMG 애플, 거기서 뭐하는거야?


구조체에 3 개의 변수가 있었고 잘 작동하여 4 번째를 추가하면 세분화 오류 문제가 발생했습니다. 클래스 구조체를 변경하면 나를 위해 그것을 해결
Ehab 메르

1

제 경우에는 변수에 클래스 이름을 사용하기 때문에이 오류

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

그리고 이것은 내 문제를 해결합니다.

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

1

필자의 경우 이것은 프로토콜에서 잘못된 정적 초기화를 수행했을 때 발생했습니다. 나는 돌아 다니는 방법을 찾았지만 컴파일러는 빌드하는 동안 세그먼트 오류를 ​​생성 해서는 안됩니다 .

관련된 세 개의 파일이 있습니다. 프로토콜 NamedSegues.swift, 콜백을 포함하는 프로토콜, 콜백을 호출하기 위해이 프로토콜에 대한 참조를 보유하는 사용자 정의 TableViewCell을 포함하는 프로토콜을 구현하는 사용자 정의 TableViewController입니다.

//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 () 선언을 삭제합니다. CustomController file2에서 : getDefault 구현을 삭제합니다. CustomCellView, file3에서 :

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

컴파일러는 이것을 포착하고 빌드 중에 세분화 오류를 던지는 대신 오류 메시지를 제공해야합니다!



1

마찬가지로 @Fjohn는 말했다,이 (모두 엑스 코드 7.0 베타 6, 엑스 코드 7 파산) 나를 위해 옵션을 풀기에 관련된 문제였다. 내 경우, 나는 기술자에 ?? 나를 밀고 이중 무슨 옵션 (의 옵션 풀기되지 않았습니다. 사용 하자가있는 경우 문제를 해결

이중 선택적 원인 분할 오류


1

다른 사람들이 위에서 언급했듯이 프로토콜을 통해 확장을 사용하고 있지만 프로토콜의 메서드 서명이 확장의 구현과 일치하지 않을 때 이런 일이 발생했습니다.

제 경우에는 구현 (확장)에 새 매개 변수를 추가했지만 프로토콜의 메소드 서명에도 추가하는 것을 잊었습니다.


1

제 경우에는 가변 매개 변수 뒤에 함수 매개 변수를 추가하려고했습니다.

매개 변수 순서를 바꾸고 가변 매개 변수를 매개 변수 목록의 마지막 매개 변수로 만들어 수정했습니다.


1

이는 일반적으로 컴파일러가 명령문 또는 명령문 내 변수의 상태를 보장 / 결정하기위한 충분한 정보 (생각하는대로)가 없을 때 발생합니다.

예를 들어, 도시 이름을 키로 입력하고 해당 우편 번호 / 우편 번호 목록을 쉼표로 구분 한 [String : String] 유형의 사전이 있다고 가정 해보십시오.

코드의 어딘가에 해당 코드 목록을 업데이트하려고한다고 상상해보십시오.

myDict[town] += newZipCode + ","

이 경우 컴파일러는 다음과 같이 세분화 오류로 응답합니다. town 사전에 없을 수있는 하므로 위의 명령문이 유효한 값을 갖는다 고 보장 할 수 없습니다.

이 문제를 해결하려면의 현재 상태를 myDict[town]별도의 변수에 저장 하여 대 / 소문자를 처리 key not in dict한 다음 지정된 키의 값을 업데이트해야합니다.

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

불행히도 근본 원인을 파악하는 것이 항상 간단한 것은 아니므로이 간단한 예제가 도움이되기를 바랍니다.



1

Xcode 8.2.

추가 @nonobjc확장의 원인이 세그멘테이션 오류로 프로토콜 구현을. @nonobjc프로토콜 구현을 클래스 구현으로 이동 합니다.


1

제 경우 범인은 실수 로 가변 인수가 있는 배열 인수를 예상하는 함수를 오버로드했습니다 .

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

수퍼 클래스가 배열로 정의했을 때 :

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

0

나를 위해 다음 type은 선택 사항 이지만 segfault를 발생했습니다 .

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로 편집하는 동안 신호를 받았습니다. Swift에서는 그렇지 않은 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.