之前
SWIFT_WHOLE_MODULE_OPTIMIZATION =否
>调试编译需要10-15分钟
>发布编译需要25分钟
> po在LLDB中工作正常
后
SWIFT_WHOLE_MODULE_OPTIMIZATION = YES
> Debug compile需要1-2分钟
>发布编译需要〜8分钟
po总是导致Xcode崩溃
任何想法为什么可怕的编译时间基于这个信息,和/或为什么Xcode可能崩溃?
DEETS
我正在开展一个大型的100%Swift项目(目标C中有第三方库,但我们的所有代码都是Swift)。编译时间一般在10-15分钟左右,编译调试配置和编译发布配置30分钟。
这个项目由于可怕的编译时间而非常难以合作。我一直在寻找改进方法,特别是通过构建设置,几个月没有运气。我忽略的一件事是SWIFT_WHOLE_MODULE_OPTIMIZATION,特别是因为任何提及它都会增加项目的编译时间。
所以有一天我们启用了SWIFT_WHOLE_MODULE_OPTIMIZATION,并且在编译时我们提高了10倍。
问题是,现在每当我们调试项目并尝试在lldb中打印一个对象时,po myObject Xcode会立即崩溃。以下是崩溃日志中的一些信息:
Process: Xcode [5860]
Path: /Applications/Xcode.app/Contents/MacOS/Xcode
Identifier: com.apple.dt.Xcode
Version: 6.4 (7720)
Build Info: IDEFrameworks-7720000000000000~8
App Item ID: 497799835
App External ID: 812725084
Code Type: X86-64 (Native)
Parent Process: ??? [1]
Responsible: Xcode [5860]Date/Time: 2015-08-05 15:53:08.265 -0600
OS Version: Mac OS X 10.11 (15A235d)
Report Version: 11Time Awake Since Boot: 13000 seconds
Crashed Thread: 20
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x000000000000008f
Exception Note: EXC_CORPSE_NOTIFYVM Regions Near 0x8f:
–>
__TEXT 000000010ef62000-000000010ef63000 [ 4K] r-x/rwx SM=COW /Applications/Xcode.app/Contents/MacOS/XcodeApplication Specific information:
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,std::__1::unique_ptr<swift::Lowering::Initialization,std::__1::default_delete<swift::Lowering::Initialization> >,void>::visit(swift::Pattern*) + 404 14 com.apple.LLDB.framework 0x0000000116ebbc57 swift::ASTVisitor<(anonymous namespace)::InitializationForPattern,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&,bool) + 98 23 com.apple.LLDB.framework 0x00000001172aa617 lldb_private::SwiftExpressionParser::Parse(lldb_private::Stream&,unsigned int,unsigned int) + 10715 24 com.apple.LLDB.framework 0x000000011706b3e8 lldb_private::ClangUserExpression::Parse(lldb_private::Stream&,lldb_private::ExecutionContext&,lldb_private::ExecutionPolicy,unsigned int) + 1064 25 com.apple.LLDB.framework 0x000000011706cdb4 lldb_private::ClangUserExpression::Evaluate(lldb_private::ExecutionContext&,lldb_private::EvaluateExpressionoptions const&,char const*,lldb_private::SharingPtr<lldb_private::ValueObject>&,lldb_private::Error&,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::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。任何帮助是赞赏!
解决方法
我强烈建议寻找其他原因,因为这个选项告诉你,你的问题在别的地方,因为它影响到应用程序的性能,而不是建立速度。也许你有你的.pch文件的东西不属于这个东西,可能会导致这种减速。
其他有趣的事情是使用推理。我个人为每个变量声明类型,因为它更容易为别人阅读,但还有更多。由于推理可能会变得复杂,因此编译器可能花费大量的时间来确定代码的实际情况。 Read this example article,虽然它更像是alpha问题。不过可能,也许,你的代码中也有这样的东西。值得做的是尝试删除所有的swift代码,编译库,如果这样很好,那么你知道问题是在你的swift代码,它可能与此连接。
此外,如果您提供的是什么实际上会减慢您的构建时间(因为您可以看到整个构建过程与时间戳,并且很可能只有一步将永远),它可以帮助更准确地确定问题。
希望有帮助!
编辑:Another article关于这个感兴趣的话题
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。