2017-02-15 9 views
3

Ich versuche, ein Archiv meiner Anwendung zu erstellen, aber ich bekomme einen Segmentierungsfehler beim Erstellen für ein iOS-Gerät. Ich stoße nicht auf dieses Problem, wenn ich für den Simulator baue. Bisher habe ich:Segmentierung Fehler 11, Xcode 8.2.1, Swift 3

  • Gereinigt mein Projekt
  • Gereinigt mein build Ordner
  • Gelöschte meine abgeleiteten Datenordner
  • installierte Mac OS Sierra
  • Installierte Zusatz Xcode Tools nach Sierra Aktualisierung
  • Xcode/Computer mehrfach neu gestartet

Der Fehler oder sieht in der Regel wie folgt aus:

Call parameter type does not match function signature! 
0 swift     0x000000010f4ab3ad PrintStackTraceSignalHandler(void*) + 45 
1 swift     0x000000010f4aab56 SignalHandler(int) + 790 
2 libsystem_platform.dylib 0x00007fffb1b28bba _sigtramp + 26 
3 libsystem_platform.dylib 0x000000011033a000 _sigtramp + 1585517664 
4 swift     0x000000010f3038e8 llvm::TypeFinder::incorporateValue(llvm::Value const*) + 296 
5 swift     0x000000010f3032fa llvm::TypeFinder::run(llvm::Module const&, bool) + 682 
6 swift     0x000000010f1c827e (anonymous namespace)::TypePrinting::incorporateTypes(llvm::Module const&) + 30 
7 swift     0x000000010f1c9bdb printAsOperandImpl(llvm::Value const&, llvm::raw_ostream&, bool, llvm::ModuleSlotTracker&) + 171 
8 swift     0x000000010f30c633 (anonymous namespace)::VerifierSupport::Write(llvm::Value const*) + 67 
9 swift     0x000000010f31616e (anonymous namespace)::Verifier::VerifyCallSite(llvm::CallSite) + 590 
10 swift     0x000000010f318ef3 (anonymous namespace)::Verifier::visitCallInst(llvm::CallInst&) + 35 
11 swift     0x000000010f329ac1 (anonymous namespace)::VerifierLegacyPass::runOnFunction(llvm::Function&) + 1649 
12 swift     0x000000010f2e089d llvm::FPPassManager::runOnFunction(llvm::Function&) + 973 
13 swift     0x000000010f2e02ab llvm::FPPassManager::runOnModule(llvm::Module&) + 43 
14 swift     0x000000010f2e977a llvm::legacy::PassManager::run(llvm::Module&) + 1514 
15 swift     0x000000010c605901 performLLVM(swift::IRGenOptions&, swift::DiagnosticEngine&, llvm::sys::SmartMutex<false>*, llvm::GlobalVariable*, llvm::Module*, llvm::TargetMachine*, llvm::StringRef) + 5921 
16 swift     0x000000010c6038c1 performIRGeneration(swift::IRGenOptions&, swift::ModuleDecl*, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, swift::SourceFile*, unsigned int) + 2625 
17 swift     0x000000010c4b8f31 performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*) + 23777 
18 swift     0x000000010c4b12b3 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 17859 
19 swift     0x000000010c46d5cf main + 8239 
20 libdyld.dylib   0x00007fffb191b255 start + 1 

Im Stapelabbild, gibt es diese Zeile:

2. Running pass 'Module Verifier' on function '@_TZFC12MyAppName23MyClassNameg13nextImagePathV10Foundation3URL' 

Ich denke, das zeigt der Fehler ausgelöst wird, wenn die statische berechnete variable Zusammenstellung nextImagePath, die eine URL zurück zu einem Dateipfad. Intern beruht dies auf einigen anderen berechneten Variablen und einer Methode nextFilePathForDirectoryAtURL. Insgesamt sieht der Code wie folgt aus:

/* 
* This is the offending computed variable. 
*/ 

static var nextImagePath: URL { 
    return nextFilePathForDirectoryAtURL(imageDirectory, withExtension: "jpg"); 
} 

/* 
* The method called by above variable. It looks through all the 
* files in a directory, finds the one with the highest index, 
* and returns a new path by incrementing the highest index by 1. 
*/ 

fileprivate static func nextFilePathForDirectoryAtURL(_ url: URL, withExtension ext: String) -> URL { 
    guard let files = try? FileManager.default.contentsOfDirectory(
    at: url, 
    includingPropertiesForKeys: nil, 
    options: .skipsHiddenFiles) else { 
     fatalError("Could not create next file path for directory at url: \(url)"); 
    } 

    var maxFileNumber = 0; 
    for file in files { 
    let fileName = file.deletingPathExtension().lastPathComponent; 

    guard 
     let fileNumber = Int(fileName), 
     file.pathExtension.lowercased() == ext.lowercased() 
     else { continue } 

    maxFileNumber = max(maxFileNumber, fileNumber); 
    } 

    return url.appendingPathComponent("\(maxFileNumber + 1).\(ext)"); 
} 

/* 
* Some supporting computed variables for constructing directories. 
*/ 

fileprivate static var libraryDirectory: URL { 
    guard let url = try? FileManager.default.url(
    for: .libraryDirectory, 
    in: .userDomainMask, 
    appropriateFor: nil, 
    create: true) else { 
     fatalError("Could not create library directory url."); 
    } 

    return url; 
} 

fileprivate static var documentSetDirectory: URL { 
    let directory = libraryDirectory.appendingPathComponent("MemberDocumentSets"); 

    try? FileManager.default.createDirectory(
    at: directory, 
    withIntermediateDirectories: true, 
    attributes: nil); 

    return directory; 
} 

fileprivate static var imageDirectory: URL { 
    let directory = documentSetDirectory.appendingPathComponent("Images"); 

    try? FileManager.default.createDirectory(
    at: directory, 
    withIntermediateDirectories: true, 
    attributes: nil); 

    return directory; 
} 

Ich bin nicht wirklich sicher, warum dieser Fehler auftritt, oder warum es nicht passieren, wenn für den Simulator zu bauen. Ich habe versucht, Antworten für ungefähr 5 Stunden jetzt ohne Glück zu finden, also hatte ich Post gedacht. Jede Hilfe wird sehr geschätzt. Vielen Dank!

Antwort

0

Welp, nach vielen Stunden konnte ich folgern, dass der Fehler durch die documentSetDirectory berechnete Variable verursacht wurde. Anscheinend war der Compiler nicht glücklich darüber, das Ergebnis einer try-Anweisung in ein optionales konvertieren. Stattdessen musste ich die Anweisung in einen do catch Block schreiben. Der folgende Code behebt mein Problem:

fileprivate static var documentSetDirectory: URL { 
    let directory = libraryDirectory.appendingPathComponent("MemberDocumentSets"); 

    do { 
    try FileManager.default.createDirectory(
     at: directory, 
     withIntermediateDirectories: true, 
     attributes: nil); 
    } catch { 

    /* 
    * Do nothing. So why have a catch block at all? Because: for some reason 
    * this prevents the compiler from spitting up. Apparently it didn't like 
    * converting the `try` to an optional here. Weirdly, I'm still doing the 
    * optional conversion elsewhere in this same class without issue (see 
    * computed variables below). 
    * 
    * ¯\_(ツ)_/¯ 
    */ 
    } 

    return directory; 
} 

fileprivate static var imageDirectory: URL { 
    let directory = documentSetDirectory.appendingPathComponent("Images"); 

    try? FileManager.default.createDirectory(
    at: directory, 
    withIntermediateDirectories: true, 
    attributes: nil); 

    return directory; 
} 

Offensichtlich muss dies ein Fehler mit dem Compiler sein. Ich habe ein leeres Projekt erstellt und den ursprünglichen Code kopiert, aber es wurde ohne Probleme kompiliert, und ich konnte keine Unterschiede in den Projekteinstellungen finden, die den gleichen Fehler verursachten. Auf jeden Fall bin ich froh, dass ich eine Lösung gefunden habe, und hoffentlich werde ich in Zukunft ein paar armen Seelen eine Zeit sparen.

Verwandte Themen