2017-02-15 26 views
3

私のアプリケーションのアーカイブを作成しようとしていますが、iOSデバイス用のビルド時にセグメント違反が発生しています。私はシミュレータのためにビルドするときにこの問題に遭遇しません。これまでのところ、私がしている:私のプロジェクト セグメンテーションフォールト11、Xcode 8.2.1、Swift 3

  • 私のビルドフォルダをクリーンクリーン

    • は私の派生データフォルダーを削除したインストール済み
    • のMac OSシエラ
    • シエラ
    • にアップデートした後、追加のXcodeツールをインストール
    • 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' 
    

    は、私は、これはURLを返す静的計算された変数nextImagePathを、コンパイル時にエラーがスローされていることを示し考えますファイルパスに移動します。内部的には、これは他のいくつかの計算された変数とメソッド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; 
    } 
    

    明らかに、これはコンパイラのバグでなければなりません。私は空のプロジェクトを作成し、元のコードをコピーしましたが、それは問題なくコンパイルされ、私は同じエラーを引き起こしたプロジェクト設定の違いを見つけることができませんでした。いずれにしても、私は解決策を見つけられたことをうれしく思っています。将来的には、貧しい人々のために時間を節約することができればと思います。

    関連する問題