Lỗi phân đoạn trình biên dịch Swift khi xây dựng


100

Thêm một (thuận tiện) tính toán heighttài sản để UIViewtrong tôi UIViewExtension.swifttập tin đang gây ra trình biên dịch Swift để segfault ... Điều gì có thể được đi sai ở đây?

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

Nếu cần thêm thông tin để bẻ khóa điều này, chỉ cần bình luận. Cảm ơn!

Biên tập:

Đây là .xcodeproj có liên quan trả về lỗi trình biên dịch của câu hỏi này. Tải xuống ở đây


7
trình biên dịch không nên segfault. nếu đây là vấn đề mới, hãy gửi báo cáo lỗi.
Karoly Horvath

3
Có vẻ như một lỗi trình biên dịch. Bạn nên báo cáo với Apple để họ sắp xếp.
Chuck

11
Trình biên dịch đã được đặt theo mặc định bên trái và bên phải vì tôi đã chuyển một dự án Objective-C sang Swift. Ít ra thì cũng không vui lắm.
aleclarson

1
@aleclarson Tôi cho rằng phiên bản phát hành sẽ hoạt động tốt hơn, nhưng nếu bạn tìm thấy lỗi, tôi sẽ báo cáo vì đó có thể là cách duy nhất để chúng được sửa trước khi phát hành.
Joachim Isaksson

6
Tôi đã mơ tưởng rằng Swift sẽ sẵn sàng sử dụng ngay khi ra khỏi cổng. Chờ đợi thật tệ! :)
aleclarson

Câu trả lời:


74

Tôi gặp lỗi này vì tôi đang làm điều này:

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

}

thay vì

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

}

vì vậy tôi nghĩ tùy chọn không được mở trong nếu điều kiện có thể gây ra lỗi này


3
Đó cũng là nguyên nhân cho tôi. Nhưng điều đó đã được cho là chính xác phải không? Nó chỉ là một lỗi biên dịch là nó
DeFrenZ

Tương tự. Kiểm tra enum tùy chọn. Hy vọng họ sửa chữa nó
mente

Mã đúng sẽ là: if (currentMeal.State == .Deleted) {} ​​vì Swift nạp chồng một cách hữu ích == cho hai tùy chọn tương đương nhau. Bài của Fjohn khá nguy hiểm.
mattyohe 13/115

1
Đó là về một lỗi biên dịch, mã tôi đã sử dụng sẽ rất nguy hiểm nếu biến không được xác minh trước đó. những gì về mã của bạn nếu currentMeal là con số không? nó giống nhau không? bạn có thể giải thích cho tôi lý do tại sao mã của tôi nguy hiểm hơn mã của bạn không? nhanh chóng tận dụng lợi thế của tùy chọn mà không sử dụng "?" ?
Fjohn

Cảm ơn, đây cũng là trường hợp của tôi. Swift đã mang đến cho tôi những bất ngờ khó chịu trong suốt chặng đường, nhưng điều này đã vượt quá giới hạn.
CodeBrew

26

Khi bạn chạy vào trình biên dịch segfault trong Swift, bạn không nhận được số dòng hữu ích và thông báo lỗi. Đây là cách bạn có thể theo dõi sự cố:

  1. Tạo một tệp mới được gọi SegFaultDebugger.swifttrong dự án của bạn.
  2. Trong tệp mới này, xác định một phần mở rộng cho lớp đang gây ra sự cố cho bạn.
  3. Di chuyển một nhóm phương thức từ tệp chính sang SegFaultDebugger.swift.
  4. Biên dịch.

Tại thời điểm này, một trong ba điều xảy ra:

  • Bạn vẫn nhận được segfault trong tệp gốc : Di chuyển các phương thức từ SegFaultDebugger.swifttrở lại tệp gốc và chuyển một nhóm phương thức khác vào SegFaultDebugger.swift. Nói lại
  • Bạn nhận được một segfault ởSegFaultDebugger.swift : Tuyệt vời! Bây giờ sử dụng tìm kiếm nhị phân để ghim segfault xuống một phương thức cụ thể cho đến khi bạn có thể tìm ra cấu trúc nào gây ra nó.
  • Bạn nhận được lỗi trình biên dịch có ý nghĩa : Tuyệt vời! Sửa lỗi. Sau khi mọi thứ được biên dịch, hãy chuyển các phương thức của bạn trở lại tệp gốc.

1
Cảm ơn! Điều này đã giúp tôi sau nhiều giờ vò đầu bứt tai.
dejavu89

1
Điều này rất hữu ích! Trong trường hợp của tôi, tôi đã có NSFetchedResultsControllerDelegate trong một tiện ích mở rộng và nó đủ để hợp nhất nó trở lại khối lớp chính.
Mikael Grön

@ MikaelGrön - bạn có thể mở rộng về điều đó không? Chính xác thì bạn đã có những gì trong phần mở rộng?
RyanJM

Nhưng làm thế nào để bạn biết lớp nào là người đưa ra các vấn đề cho bạn?
Reverend

@theReverend Nếu không chắc chắn, bạn sẽ phải thử từng lớp trong tệp vi phạm. Nhưng swiftc đã không thực sự gặp vấn đề về segfault trong một vài năm - không chắc câu trả lời của tôi thậm chí còn phù hợp nữa.
Bill

12

Tôi đã gặp lỗi này khi mở rộng một trong các giao thức của mình và nhập sai đối số kiểu tùy chọn.

protocol SomeProtocolName: class {
    var someProtocolVariable: String { get set }

    func someProtocolFunction(someProtocolVariable: String)
}

// MARK:
extension SomeProtocolName {
    func someProtocolFunction(someProtocolVariable: String?) {
        self.someProtocolVariable = someProtocolVariable
    }
}

Sự khác biệt về đối số hàm Stringtrong nguyên mẫu và String?trong phần mở rộng đã gây ra Lỗi phân đoạn 11 .


3
Tôi cũng có cái này. Có vẻ như Apple gặp một số vấn đề với cách nhập tùy chọn của họ. Một vấn đề chính là khi nào! được sử dụng bên trong một kiểu biến. Nó không phải là tùy chọn theo mặc định, nhưng trình biên dịch bị nhầm lẫn.
user1122069 21/02/16

@ user1122069 đồng ý, giao thức còn một số vấn đề. Hy vọng với các phiên bản tiếp theo, vấn đề này sẽ được khắc phục.
victor.vasilica

Tôi không nói về các giao thức, chỉ nói chung chung. Tôi vừa học được những gì! bên trong một biến, nhưng IDE và trình biên dịch thường không nhận được lỗi chính xác cho !.
user1122069 24/02/16

@ user1122069 xấu quá, sry.
victor.vasilica

Điều này xảy ra với tôi khi thêm nhiều mặt hàng trong một mảng
aguilarpgc

9

Tôi cũng gặp lỗi này và tôi đã sửa nó như thế này:

Kiểm tra dự án của bạn và tìm ra tệp nào được sử dụng hai lần và xóa một tệp hoặc xóa và thêm lại tất cả.

Lỗi trong Xcode của tôi:

: 0: error: tên tệp "AttributedString.swift" được sử dụng hai lần: '/Users/.../CNJOB/CNJOB/AttributedString.swift' và '/Users/.../CNJOB/CNJOB/AttributedString.swift'

: 0: note: tên tệp được sử dụng để phân biệt các khai báo riêng có cùng tên

: 0: error: tên tệp "APIClient.swift" được sử dụng hai lần: '/Users/.../CNJOB/CNJOB/APIClient.swift' và '/Users/.../CNJOB/CNJOB/APIClient.swift'

: 0: note: tên tệp được sử dụng để phân biệt các khai báo riêng có cùng tên

Command / Applications / Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc không thành công với mã thoát 1


8

Trong Xcode 7, bạn có thể nhấp vào lỗi trong Bộ điều hướng gỡ lỗi và bạn sẽ được hiển thị một cái nhìn mở rộng về các sự cố. Nhấp vào nút hamburger ở bên phải sẽ mở rộng lỗi và nếu bạn cuộn xuống cuối thông báo lỗi mở rộng, bạn sẽ thấy nó đến từ đâu.

nhập mô tả hình ảnh ở đây

Đối với tôi, tôi đã có hai trong số những lỗi lỗi phân đoạn. Trong hình trên, hình đầu tiên là khi thu gọn, hình thứ hai là khi bạn mở rộng nút hamburger. Ở dưới cùng của hộp màu xám mở rộng, bạn sẽ thấy một thông báo cho biết nơi trình biên dịch bị lỗi.

Tuy nhiên, lưu ý rằng thông báo lỗi đôi khi có thể không đủ thông tin, vì vậy mặc dù nó cho bạn biết vị trí mà nó bị lỗi, nó không phải lúc nào cũng cho biết lý do và cách khắc phục. Việc loại bỏ lỗi này vẫn còn là một vấn đề phỏng đoán.


1
Có thể theo dõi các lỗi từ Bộ điều hướng. Cảm ơn, điều này đã giúp tôi sửa lỗi của mình!
Vishal Chandran

5

Tôi đã phát hiện ra một giải pháp đơn giản cho đến khi sự cố được khắc phục trong bản dựng Xcode / Swift trong tương lai:

  • Chỉ cần đặt tất cả các tiện ích mở rộng gây ra sự cố trong .swifttệp mà nó đang được sử dụng.

Trong dự án mẫu bạn đã cung cấp, hãy đặt nội dung của UIViewExtension.swift CALayerExtension.swift ở trên AppDelegate.swift

Hy vọng rằng điều này có thể giúp chúng tôi viết mã Swift hoạt động cho đến khi sự cố được giải quyết.


4

Đối với tôi, thêm privatevào sự cố sập clang static var fixed:

private static var taskId = 0

2

Tôi đã gặp lỗi phân đoạn trình biên dịch trên một câu lệnh như sau:

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

Tôi chỉ thực hiện một câu lệnh if-else thay vào đó và nó hoạt động.


1
Swift 3: câu trả lời này giải quyết lỗi phân đoạn 11 trong nhiều dự án.
Alessandro Ornano

Wow, không thể tin được. Trình biên dịch Swift giống như một phiên bản alpha với tất cả những vấn đề này. Cảm ơn vì điều này.
TGO

2

Bạn cũng có thể gặp sự cố này nếu bạn khai báo một điều kiện với Bool chưa được bao bọc dưới dạng thuộc tính


1

Trong trường hợp của tôi, một dấu hai chấm không đúng vị trí trong quá trình nội suy chuỗi đã phá vỡ của tôi (XCode 6.1.1).

Thí dụ:

println("\(value1:value2)") 

khi tôi định làm:

println("\(value1) : \(value2)")

1

Lỗi này đã xảy ra với tôi khi tôi cố gắng ghi đè biến yếu từ lớp cha.

Trong lớp cơ sở:

weak var stripeViewDelegate : StripeViewDelegate? = nil    

Lớp có nguồn gốc:

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

    }

Lỗi đã biến mất khi tôi xóa =nilkhỏi lớp dẫn xuất.


1

Tôi bắt gặp một số ngoại lệ hôm nay

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

và điều này đã giải quyết nó:

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

Bởi vì loại "Bất kỳ" là bất kỳ loại sự kiện "nil", "AnyObject", tùy chọn, ... :) Nó không thể là tùy chọn, nó đã là tùy chọn.

typealias Any = protocol<>

Trường hợp của tôi cũng là vấn đề với "Bất kỳ"
Adriano Spadoni

1

Lỗi này cũng xảy ra nếu bạn vô tình khai báo một biến có kiểu khớp với tên của nó:

    var sectionGroup: sectionGroup? { ... }

Điều này sẽ không thành vấn đề nếu bạn đã tuân theo quy ước đặt tên của Apple và sử dụng chữ hoa đầu tiên cho loại này. Đó có thể là lý do tại sao Apple không vấp phải nó. Hơn nữa, câu trả lời của bạn có vẻ giống với câu trả lời của @aminhotob
qwerty_so

1

Gặp lỗi này do một kiểu chung không liên quan trên một hàm toán tử, ví dụ:

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

Trong trường hợp của tôi, xóa đã <T>giải quyết được vấn đề.


Vấn đề tương tự ở đây, nói chung có vẻ như việc xác định các generic không thực sự được sử dụng sẽ gây ra lỗi này.
Kevin R

1

Trong trường hợp của tôi, tôi đã khai báo structbên trong a func. Chuyển structđến cấp lớp đã giải quyết được vấn đề.

Bây giờ tôi viết điều này, tôi nhớ đã có vấn đề với structbên trong funcs trước đây. Đó là một cái gì đó khác ngoài lỗi phân đoạn (dường như trở nên nổi tiếng với Swift 1.2 beta). OMG Apple, bạn đang làm gì ở đó?


Tôi có 3 biến trong một cấu trúc và nó hoạt động tốt, việc thêm biến thứ 4 bắt đầu gây ra sự cố lỗi phân đoạn. thay đổi cấu trúc để lớp giải quyết nó cho tôi
ehab Amer

1

Trong trường hợp của tôi, lỗi này do tôi sử dụng tên Lớp cho biến

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

Và điều này khắc phục sự cố của tôi

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

1

Tôi là trường hợp của tôi, điều này đã xảy ra khi tôi khởi tạo tĩnh không chính xác trong một giao thức. Tôi đã tìm ra cách để giải quyết vấn đề, nhưng một trình biên dịch không bao giờ được tạo ra lỗi phân đoạn trong khi xây dựng.

Có ba tệp liên quan. Một giao thức NamedSegues.swift, một TableViewController tùy chỉnh trong số những thứ khác triển khai giao thức có chứa một lệnh gọi lại, một TableViewCell tùy chỉnh chứa tham chiếu đến giao thức này để gọi lệnh gọi lại.

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

Tôi có xung quanh nó bằng cách sử dụng?

Trong tệp giao thức, tệp1: xóa phần khai báo của getDefault () Trong tệp CustomController 2: xóa phần triển khai của getDefault. Trong CustomCellView, tệp3:

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

Trình biên dịch lẽ ra phải bắt được điều này và đưa ra một số thông báo lỗi thay vì đưa ra lỗi phân đoạn trong quá trình xây dựng!


1

Có vẻ như trình biên dịch Swift 2 có thể chưa hoàn toàn sẵn sàng cho thời gian đầu! Trong trường hợp điều này giúp ích cho bất kỳ ai, tôi đã gặp lỗi phân đoạn: 11 do không khớp với loại biến trong tiêu đề bao đóng, cụ thể là trong phương thức Phân tích cú pháp PFQuery.query.findObjectsInBackgroundWithBlock,.

Bạn có thể xem vấn đề chi tiết hơn tại đây: https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/280


1

Giống như @Fjohn đã nói, đây là một vấn đề liên quan đến việc mở gói tùy chọn đối với tôi (đã bị hỏng trong cả Xcode 7.0 beta 6 và Xcode 7). Trong trường hợp của tôi, tôi đã không bỏ gói tùy chọn của tùy chọn (những gì đã giới hạn tôi là gấp đôi ?? trong bộ mô tả. Sử dụng if let đã giải quyết được vấn đề

tùy chọn kép gây ra lỗi phân đoạn


1

Như những người khác đã viết ở trên, đối với tôi, điều này đã xảy ra khi tôi đang sử dụng tiện ích mở rộng qua một giao thức nhưng chữ ký của các phương thức trong giao thức không khớp với việc triển khai trong tiện ích mở rộng.

Trong trường hợp của tôi, tôi đã thêm một tham số mới vào việc triển khai (trong phần mở rộng) nhưng lại quên thêm nó vào chữ ký của phương thức trong giao thức.


1

trong trường hợp của tôi, tôi đã cố gắng thêm một tham số hàm sau một tham số variadic.

Việc đảo ngược chuỗi tham số và đặt tham số variadic thành tham số cuối cùng trong danh sách tham số đã sửa nó.


1

Điều này thường xảy ra khi trình biên dịch không có đủ thông tin (bất chấp những gì bạn nghĩ) để đảm bảo / xác định trạng thái của một câu lệnh hoặc một biến trong một câu lệnh.

Ví dụ: hãy tưởng tượng bạn có một từ điển loại [Chuỗi: Chuỗi] mà bạn điền tên thành phố làm khóa và danh sách các mã zip / mã bưu điện tương ứng được phân tách bằng dấu phẩy.

Hãy tưởng tượng rằng ở đâu đó trong mã của bạn, bạn muốn cập nhật danh sách các mã tương ứng:

myDict[town] += newZipCode + ","

Trong trường hợp này, trình biên dịch sẽ phản hồi với lỗi phân đoạn như town có thể không có trong từ điển và do đó nó không thể đảm bảo rằng câu lệnh trên sẽ có giá trị hợp lệ.

Để giải quyết vấn đề này, bạn nên lưu trữ trạng thái hiện tại của myDict[town]trong một biến riêng biệt cho phép bạn xử lý trường hợp key not in dictvà sau đó cập nhật giá trị cho khóa đã cho:

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

Thật không may, không phải lúc nào cũng dễ dàng xác định nguyên nhân gốc rễ vì vậy tôi hy vọng ví dụ đơn giản này sẽ giúp ích cho bạn.


1

Swift 3.0 (Xcode 8.1) cho thấy vấn đề này khi một giao thức khai báo một biến tùy chọn và người triển khai thực hiện biến đó như một biến khởi tạo lười biếng.

Lỗi được báo cáo tại đây: https://bugs.swift.org/browse/SR-1825


1

Xcode 8.2.

Thêm @nonobjctriển khai giao thức vào tiện ích mở rộng gây ra lỗi phân đoạn. Chuyển @nonobjcviệc triển khai giao thức vào thực thi lớp.


1

Trong trường hợp của tôi là thủ phạm đã vô tình làm quá tải một chức năng hy vọng một mảng tranh cãi với một với một variadic luận:

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

Khi lớp cha có nó được định nghĩa là một mảng:

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

0

Đối với tôi, điều sau đây gây ra lỗi mặc định trong khi typelà một tùy chọn:

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

và điều này đã giải quyết nó:

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

0

Tôi gặp lỗi này với chữ ký phương thức sau trong UITableViewController tùy chỉnh.

func filterContentForSearchText(searchText: String)

thay đổi thành:

func filterContentForSearchText(searchText: String!)

đã khắc phục sự cố.


0

Tôi đã gặp vấn đề tương tự trong một phần mở rộng. Tiện ích mở rộng của tôi có hai trình khởi tạo tiện lợi:

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

Để loại bỏ lỗi, tôi đã thêm một bản đồ phương thức cá thể (từ điển: NSDictionary) và lỗi lỗi phân đoạn đã biến mất.

convenience init(dictionary: NSDictionary, context: NSManagedObjectContext) {
    self.init(context: context)
    map(dictionary)
}

0

Đối với tôi, vấn đề là kiến ​​trúc của tôi không được đặt theo tiêu chuẩn. Tôi đã thêm i386 hoặc cái gì đó, chỉ cần đặt nó trở lại vòm xcodeproject mặc định và nó đã biên dịch tốt.


0

Tôi đã gặp vấn đề tương tự trong một dự án nhanh chóng. Vấn đề là một hàm lẽ ra phải trả về một đối tượng, nhưng không có trả về trong đó. Loại lỗi này từng được báo hiệu trong khi chỉnh sửa bằng Obj-C. Có vẻ như không phải là trường hợp của Swift.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.