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

내 파일 에 (편리한) 계산 된 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가 있습니다. 여기에서 다운로드



답변

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

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

}

대신에

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

}

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


답변

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

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

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

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

답변

내 프로토콜 중 하나를 확장하고 잘못 입력 된 선택적 유형 인수를 확장하는 동안이 오류가 발생했습니다.

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

: 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로 실패했습니다.


답변

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

여기에 이미지 설명 입력

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

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


답변

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

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

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

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


답변

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

private static var taskId = 0