web-dev-qa-db-ja.com

Swift WHOLE_MODULE_OPTIMIZATIONはコンパイル時間を改善しますが、lldb / Xcodeクラッシュを引き起こします

TL; DR

変更前

Swift_WHOLE_MODULE_OPTIMIZATION = NO

  • デバッグコンパイルには10〜15分かかります
  • リリースのコンパイルには25分以上かかります
  • poはLLDBで正常に動作します

Swift_WHOLE_MODULE_OPTIMIZATION = YES

  • デバッグコンパイルには1〜2分かかります
  • リリースのコンパイルには最大8分かかります
  • poalwaysは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_NOTIFY

0x8f付近の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など、複数の異なるマシンで同じです。どんな助けでもありがたいです!

27
LunaCodeGirl

私は働いており、おそらくあなたのプロジェクトよりもさらに大きなプロジェクト(50以上のライブラリ、何百ものカスタムクラスと何千ものLoC)に積極的に取り組んでいます。完全なSwiftプロジェクトであっても、コンパイルには数秒、リリースビルド(Late 2013 MBP)には最大2分かかります。

他の原因を探すことを強くお勧めします。このオプションが示すのは、問題は他の場所にあるため、速度を上げるのではなくアプリのパフォーマンスに影響を与えるためです。たぶん、あなたはそこに属していないものや何かでいっぱいの.pchファイルを持っています、それはこの種の速度低下を引き起こす可能性があります。

他の興味深いことは、推論の使用です。他の人が読みやすいからといって、すべての変数の型を個人的に宣言していますが、それだけではありません。推論は複雑になる可能性があるので、コードが実際に何をしているのかを理解するために、コンパイラーにかなりの時間をかける可能性があります。 このサンプル記事を読む 、ただしそれはアルファ問題のようなものでした。しかし、たぶん、たぶん、あなたはあなたのコードにもこのような何かを持っています。すべてのSwiftコードを削除し、それが適切に機能する場合はライブラリをコンパイルすることで、問題があなたのSwiftコードとおそらくこれに接続されます。

また、WHATを指定すると、ビルド時間が実際に遅くなります(タイムスタンプでビルドプロセス全体を確認できるため、1つのステップがいつまでも続く可能性が高いため)、問題をより正確に特定するのに役立ちます。

それが役に立てば幸い!

編集: 別の記事 この関心のあるトピックについて

11
Jiri Trecak

私はプロジェクトでこれをなんとか修正しました。 (合計コンパイル時間12分)

重要なのは、Swift_WHOLE_MODULE_OPTIMIZATION = YESで言うとおりuser defined 設定

しかし、もう1つ変更する必要があります。デバッグでは、最適化レベルをNoneに設定する必要があります。そうしないと、アプリをデバッグできません。

私はそれについてここにブログ投稿を書きました:

https://tech.zalando.com/blog/improving-Swift-compilation-times-from-12-to-2-minutes/

8
João Nunes