2017-02-15 6 views
3

Я пытаюсь создать архив своего приложения, но у меня возникает ошибка сегментации при создании устройства iOS. Я не сталкиваюсь с этой проблемой при создании симулятора. До сих пор у меня есть:Сегментация Fault 11, Xcode 8.2.1, Swift 3

  • Убирали мой проект
  • Убирали мою папку сборки
  • Удаляется моя получена папка данных
  • установлен Mac OS Sierra
  • Установленные дополнительные инструменты Xcode после обновления Sierra
  • Перезапущенный Xcode/компьютер несколько раз

Ошибка или, как правило, выглядит следующим образом:

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 

В дампе стека, есть такая строка:

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

Я думаю, что это указывает на то ошибка, появляющейся при компиляции статической вычисляемый переменной nextImagePath, которая возвращает URL к файловому пути. Внутренне это зависит от нескольких других вычисленных переменных и метода nextFilePathForDirectoryAtURL. В целом, код выглядит следующим образом:

/* 
* 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; 
} 

Я не совсем уверен, почему эта ошибка происходит, и почему это не происходит при создании для симулятора. Я пытался найти ответы в течение 5 часов без везения, так что я думал о публикации. Любая помощь приветствуется. Благодаря!

ответ

0

Welp, после многих часов, я смог вывести, что ошибка была вызвана вычисленной переменной documentSetDirectory. По-видимому, компилятор был недоволен преобразованием результата оператора try в необязательный. Вместо этого мне пришлось обернуть заявление в блоке do catch. Следующий код исправил мою проблему:

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

Очевидно, это должно быть ошибкой с компилятором. Я создал пустой проект и скопировал исходный код, но он скомпилирован без проблем, и мне не удалось найти различия в настройках проекта, вызвавшие ту же ошибку. В любом случае, я рад, что нашел решение, и, надеюсь, это сэкономит некоторое время для нескольких бедных душ в будущем.

Смежные вопросы