変更前
Swift_WHOLE_MODULE_OPTIMIZATION = NO
po
はLLDBで正常に動作します後
Swift_WHOLE_MODULE_OPTIMIZATION = YES
po
alwaysはXcodeをクラッシュさせますこの情報に基づく恐ろしいコンパイル時間、および/またはXcodeがクラッシュする理由
私は100%の大規模なプロジェクトに取り組んでいますSwiftプロジェクト(Objective-Cにはサードパーティのライブラリがありますが、すべてのコードはSwiftです)。デバッグ構成をコンパイルするには-15分、リリース構成をコンパイルするには30分以上。
このプロジェクトは、恐ろしいコンパイル時間のため、作業が非常に困難でした。私はこれを改善する方法を、特にビルド設定を通して探してきましたが、何ヶ月も運がありませんでした。私が見落としたのはSwift_WHOLE_MODULE_OPTIMIZATION
でした。これについての言及があると、プロジェクトのコンパイル時間が増加すると主張しているためです。
先日、Swift_WHOLE_MODULE_OPTIMIZATION
を有効にして、コンパイル時間を10倍改善しました。
問題は、プロジェクトをデバッグしているときにpo myObject
Xcodeを使用してlldbでオブジェクトを印刷しようとすると、すぐにクラッシュすることです。クラッシュログからの情報は次のとおりです。
プロセス:Xcode [5860]
パス:/Applications/Xcode.app/Contents/MacOS/Xcode
識別子:com.Apple.dt.Xcode
バージョン:6.4(7720)
ビルド情報:IDEFrameworks-7720000000000000〜8
アプリアイテムID:497799835
アプリの外部ID:812725084
コードタイプ:X86-64(ネイティブ)
親プロセス:??? [1]
責任者:Xcode [5860]日時:2015-08-05 15:53:08.265 -0600
OSバージョン:Mac OS X 10.11(15A235d)
レポートバージョン:11起動後の起動時間:13000秒
クラッシュしたスレッド:20
例外タイプ:EXC_BAD_ACCESS(SIGSEGV)
例外コード:KERN_INVALID_ADDRESS at 0x000000000000008f
例外メモ:EXC_CORPSE_NOTIFY0x8f付近のVMリージョン:-> __TEXT 000000010ef62000-000000010ef63000 [4K] r-x/rwx SM = COW /Applications/Xcode.app/Contents/MacOS/Xcode
アプリケーション固有の情報:
ProductBuildVersion:6E35b
クラッシュしたスレッドのスタックトレースは次のとおりです。
Thread 20 Crashed:: <DBGLLDBSessionThread (pid=6402)>
0 com.Apple.LLDB.framework 0x0000000116b09ab4 Swift::ArchetypeBuilder::resolveArchetype(Swift::Type) + 68
1 com.Apple.LLDB.framework 0x0000000116b0f808 std::__1::__function::__func<substConcreteTypesForDependentTypes(Swift::ArchetypeBuilder&, Swift::Type)::$_6, std::__1::allocator<substConcreteTypesForDependentTypes(Swift::ArchetypeBuilder&, Swift::Type)::$_6>, Swift::Type (Swift::Type)>::operator()(Swift::Type&&) + 152
2 com.Apple.LLDB.framework 0x0000000116bc0986 Swift::Type::transform(std::__1::function<Swift::Type (Swift::Type)> const&) const + 54
3 com.Apple.LLDB.framework 0x0000000116bc0f2b Swift::Type::transform(std::__1::function<Swift::Type (Swift::Type)> const&) const + 1499
4 com.Apple.LLDB.framework 0x0000000116bc0bbb Swift::Type::transform(std::__1::function<Swift::Type (Swift::Type)> const&) const + 619
5 com.Apple.LLDB.framework 0x0000000116bc0c0a Swift::Type::transform(std::__1::function<Swift::Type (Swift::Type)> const&) const + 698
6 com.Apple.LLDB.framework 0x0000000116b0c8f2 Swift::ArchetypeBuilder::substDependentType(Swift::Type) + 50
7 com.Apple.LLDB.framework 0x0000000116e9554e (anonymous namespace)::LowerType::visitAnyStructType(Swift::CanType, Swift::StructDecl*) + 270
8 com.Apple.LLDB.framework 0x0000000116e92e66 Swift::Lowering::TypeConverter::getTypeLoweringForUncachedLoweredType(Swift::Lowering::TypeConverter::TypeKey) + 150
9 com.Apple.LLDB.framework 0x0000000116e92b39 Swift::Lowering::TypeConverter::getTypeLowering(Swift::Lowering::AbstractionPattern, Swift::Type, unsigned int) + 2361
10 com.Apple.LLDB.framework 0x0000000116f8f711 lldb_private::SwiftSILManipulator::emitLValueForVariable(Swift::VarDecl*, lldb_private::SwiftExpressionParser::SILVariableInfo&) + 1521
11 com.Apple.LLDB.framework 0x00000001172ac7ee (anonymous namespace)::LLDBNameLookup::emitLValueForVariable(Swift::VarDecl*, Swift::SILBuilder&) + 102
12 com.Apple.LLDB.framework 0x0000000116ebb162 Swift::Lowering::SILGenFunction::emitInitializationForVarDecl(Swift::VarDecl*, Swift::Type) + 98
13 com.Apple.LLDB.framework 0x0000000116ebbc74 Swift::ASTVisitor<(anonymous namespace)::InitializationForPattern, void, void, void, std::__1::unique_ptr<Swift::Lowering::Initialization, std::__1::default_delete<Swift::Lowering::Initialization> >, void, void>::visit(Swift::Pattern*) + 404
14 com.Apple.LLDB.framework 0x0000000116ebbc57 Swift::ASTVisitor<(anonymous namespace)::InitializationForPattern, void, void, void, std::__1::unique_ptr<Swift::Lowering::Initialization, std::__1::default_delete<Swift::Lowering::Initialization> >, void, void>::visit(Swift::Pattern*) + 375
15 com.Apple.LLDB.framework 0x0000000116ebba0d Swift::Lowering::SILGenFunction::visitPatternBindingDecl(Swift::PatternBindingDecl*) + 45
16 com.Apple.LLDB.framework 0x0000000116f0617c Swift::Lowering::SILGenFunction::visitBraceStmt(Swift::BraceStmt*) + 284
17 com.Apple.LLDB.framework 0x0000000116ecd1c0 Swift::Lowering::SILGenFunction::emitFunction(Swift::FuncDecl*) + 320
18 com.Apple.LLDB.framework 0x0000000116ea3966 Swift::Lowering::SILGenModule::emitFunction(Swift::FuncDecl*) + 246
19 com.Apple.LLDB.framework 0x0000000116ea3828 Swift::Lowering::SILGenModule::visitFuncDecl(Swift::FuncDecl*) + 168
20 com.Apple.LLDB.framework 0x0000000116ea579b Swift::Lowering::SILGenModule::emitSourceFile(Swift::SourceFile*, unsigned int) + 427
21 com.Apple.LLDB.framework 0x0000000116ea5c22 Swift::SILModule::constructSIL(Swift::Module*, Swift::SILOptions&, Swift::SourceFile*, llvm::Optional<unsigned int>, bool, bool) + 386
22 com.Apple.LLDB.framework 0x0000000116ea5d42 Swift::performSILGeneration(Swift::SourceFile&, Swift::SILOptions&, llvm::Optional<unsigned int>, bool) + 98
23 com.Apple.LLDB.framework 0x00000001172aa617 lldb_private::SwiftExpressionParser::Parse(lldb_private::Stream&, unsigned int, unsigned int, unsigned int) + 10715
24 com.Apple.LLDB.framework 0x000000011706b3e8 lldb_private::ClangUserExpression::Parse(lldb_private::Stream&, lldb_private::ExecutionContext&, lldb_private::ExecutionPolicy, bool, unsigned int) + 1064
25 com.Apple.LLDB.framework 0x000000011706cdb4 lldb_private::ClangUserExpression::Evaluate(lldb_private::ExecutionContext&, lldb_private::EvaluateExpressionOptions const&, char const*, char const*, lldb_private::SharingPtr<lldb_private::ValueObject>&, lldb_private::Error&, unsigned int, std::__1::shared_ptr<lldb_private::Module>*) + 628
26 com.Apple.LLDB.framework 0x00000001171d1696 lldb_private::Target::EvaluateExpression(char const*, lldb_private::StackFrame*, lldb_private::SharingPtr<lldb_private::ValueObject>&, lldb_private::EvaluateExpressionOptions const&) + 376
27 com.Apple.LLDB.framework 0x000000011716d75c lldb_private::SwiftLanguageRuntime::GetObjectDescription(lldb_private::Stream&, lldb_private::ValueObject&) + 668
28 com.Apple.LLDB.framework 0x00000001170464e6 lldb_private::ValueObject::GetObjectDescription() + 370
29 com.Apple.LLDB.framework 0x000000011548e228 lldb::SBValue::GetObjectDescription() + 76
30 com.Apple.dt.dbg.DebuggerLLDB 0x00000001153f3c9e -[DBGLLDBDataValue _lldbValueObjectDescription] + 24
31 com.Apple.dt.dbg.DebuggerLLDB 0x00000001153f3b7f -[DBGLLDBDataValue lldbDescription] + 29
32 com.Apple.dt.dbg.DebuggerLLDB 0x00000001154023dc __87-[DBGLLDBSession printDescriptionOfDataValueToConsole:runAllThreads:completionHandler:]_block_invoke + 182
33 com.Apple.dt.dbg.DebuggerLLDB 0x0000000115402e6d -[DBGLLDBSession handleNextActionWithState:withRunPending:] + 424
34 com.Apple.dt.dbg.DebuggerLLDB 0x00000001153fdf44 DBGLLDBSessionThread(void*) + 980
35 libsystem_pthread.dylib 0x00007fff8ec12cb3 _pthread_body + 131
36 libsystem_pthread.dylib 0x00007fff8ec12c30 _pthread_start + 168
37 libsystem_pthread.dylib 0x00007fff8ec10419 thread_start + 13
私はこの問題についてまだ多くの助けを見つけていないので、ここで新しいテクノロジーの最前線にいるようです。コンパイル時の問題を引き起こしている異常な構成があるのか、lldbがクラッシュする可能性がある既知の理由があるのかと思います。 El Capitan、Yosemite、Xcode 6.3、Xcode 6.4など、複数の異なるマシンで同じです。どんな助けでもありがたいです!
私は働いており、おそらくあなたのプロジェクトよりもさらに大きなプロジェクト(50以上のライブラリ、何百ものカスタムクラスと何千ものLoC)に積極的に取り組んでいます。完全なSwiftプロジェクトであっても、コンパイルには数秒、リリースビルド(Late 2013 MBP)には最大2分かかります。
他の原因を探すことを強くお勧めします。このオプションが示すのは、問題は他の場所にあるため、速度を上げるのではなくアプリのパフォーマンスに影響を与えるためです。たぶん、あなたはそこに属していないものや何かでいっぱいの.pchファイルを持っています、それはこの種の速度低下を引き起こす可能性があります。
他の興味深いことは、推論の使用です。他の人が読みやすいからといって、すべての変数の型を個人的に宣言していますが、それだけではありません。推論は複雑になる可能性があるので、コードが実際に何をしているのかを理解するために、コンパイラーにかなりの時間をかける可能性があります。 このサンプル記事を読む 、ただしそれはアルファ問題のようなものでした。しかし、たぶん、たぶん、あなたはあなたのコードにもこのような何かを持っています。すべてのSwiftコードを削除し、それが適切に機能する場合はライブラリをコンパイルすることで、問題があなたのSwiftコードとおそらくこれに接続されます。
また、WHATを指定すると、ビルド時間が実際に遅くなります(タイムスタンプでビルドプロセス全体を確認できるため、1つのステップがいつまでも続く可能性が高いため)、問題をより正確に特定するのに役立ちます。
それが役に立てば幸い!
編集: 別の記事 この関心のあるトピックについて
私はプロジェクトでこれをなんとか修正しました。 (合計コンパイル時間12分)
重要なのは、Swift_WHOLE_MODULE_OPTIMIZATION = YES
で言うとおりuser defined
設定
しかし、もう1つ変更する必要があります。デバッグでは、最適化レベルをNone
に設定する必要があります。そうしないと、アプリをデバッグできません。
私はそれについてここにブログ投稿を書きました:
https://tech.zalando.com/blog/improving-Swift-compilation-times-from-12-to-2-minutes/