ios - Swift WHOLE_MODULE_OPTIMIZATION mejora el tiempo de compilación, pero causa un bloqueo de lldb/Xcode
crash (2)
Conseguí arreglar esto en nuestro proyecto. (12 minutos de tiempo total de compilación)
La clave es configurar SWIFT_WHOLE_MODULE_OPTIMIZATION = YES
como usted dice en la configuración user defined
el user defined
Pero necesitas hacer un cambio más. Debe establecer el nivel de optimización en None
en la depuración; de lo contrario, no podrá depurar su aplicación.
Escribí una publicación de blog al respecto aquí:
https://tech.zalando.com/blog/improving-swift-compilation-times-from-12-to-2-minutes/
TL; DR
antes de
SWIFT_WHOLE_MODULE_OPTIMIZATION = NO
- La compilación de depuración toma 10-15 minutos
- Liberar compilación toma más de 25 minutos
-
po
funciona bien en LLDB
Después
SWIFT_WHOLE_MODULE_OPTIMIZATION = YES
- La compilación de depuración toma 1-2 minutos
- Liberar compilación toma ~ 8 minutos
-
po
siempre hace que Xcode se bloquee
¿Alguna idea de por qué los horribles tiempos de compilación basados en esta información y / o por qué Xcode podría fallar?
Deets
Estoy trabajando en un gran proyecto 100% Swift (hay bibliotecas de terceros en Objective-C, pero todo nuestro código es Swift). Hemos tenido tiempos de compilación atroces, generalmente entre 10 y 15 minutos para compilar la configuración de depuración y más de 30 minutos para compilar la configuración de la versión.
Ha sido muy difícil trabajar con este proyecto debido a los horribles tiempos de compilación. He estado buscando formas de mejorar esto, particularmente a través de configuraciones de compilación y durante meses no tuve suerte. Una cosa que pasé por alto fue SWIFT_WHOLE_MODULE_OPTIMIZATION
, particularmente porque cualquier mención de esto afirma que aumentará el tiempo de compilación de un proyecto.
Así que el otro día habilitamos SWIFT_WHOLE_MODULE_OPTIMIZATION
y he aquí que tenemos una mejora de 10x en los tiempos de compilación.
El problema es que ahora cada vez que estamos depurando el proyecto e intentamos imprimir un objeto en lldb con po myObject
Xcode se bloquea de inmediato. Aquí hay algo de información del registro de bloqueo:
Proceso: Xcode [5860]
Ruta: /Aplicaciones/Xcode.app/Contents/MacOS/Xcode
Identificador: com.apple.dt.Xcode
Versión: 6.4 (7720)
Información de compilación: IDEFrameworks-7720000000000000 ~ 8
ID del artículo de la aplicación: 497799835
Identificación externa de la aplicación: 812725084
Tipo de código: X86-64 (nativo)
Proceso de Padres: ??? [1]
Responsable: Xcode [5860]Fecha / Hora: 2015-08-05 15: 53: 08.265 -0600
Versión de SO: Mac OS X 10.11 (15A235d)
Versión del informe: 11Tiempo despierto desde el arranque: 13000 segundos
Hilo estrellado: 20
Tipo de excepción: EXC_BAD_ACCESS (SIGSEGV)
Códigos de excepción: KERN_INVALID_ADDRESS en 0x000000000000008f
Nota de excepción: EXC_CORPSE_NOTIFYRegiones VM cerca de 0x8f: -> __TEXT 000000010ef62000-000000010ef63000 [4K] rx / rwx SM = COW /Applications/Xcode.app/Contents/MacOS/Xcode
Información específica de la aplicación:
ProductBuildVersion: 6E35b
Aquí está el seguimiento de la pila en el hilo se estrelló:
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
Parece que podemos estar a la vanguardia de la nueva tecnología aquí porque todavía no he encontrado mucha ayuda en este tema. Me pregunto si tenemos algún tipo de configuración inusual que esté causando problemas de tiempo de compilación, o si existe una razón conocida por la que lldb podría estar fallando. Es lo mismo en múltiples máquinas diferentes, con El Capitán, Yosemite, Xcode 6.3, Xcode 6.4. Cualquier ayuda es apreciada!
He trabajado y estoy trabajando activamente en proyectos que probablemente sean incluso más grandes que los suyos (más de 50 bibliotecas, cientos de clases personalizadas con miles de LoC). La compilación del lanzamiento (finales de 2013 MBP) demora unos segundos en compilarse y hasta 2 minutos, incluso para el proyecto Swift completo.
Recomendaría encarecidamente buscar otras causas, ya que lo que esta opción le dice es que su problema está en otra parte, ya que afecta el rendimiento de la aplicación, no la velocidad de construcción. Tal vez tenga su archivo .pch lleno de cosas que no pertenecen allí o algo así, puede causar este tipo de desaceleración.
Otra cosa interesante es el uso de la inferencia. Yo personalmente declaro el tipo para cada variable solo porque es más fácil de leer para otros, pero hay más. Dado que la inferencia puede complicarse, puede hacer que el compilador tome MUCHO tiempo para averiguar qué hace realmente su código. Lee este artículo de ejemplo , aunque era más como un problema alfa. PERO TAL VEZ, solo tal vez, tienes algo como esto en tu código también. Lo que valdría la pena hacer es intentar eliminar todo el código Swift, compilar bibliotecas si eso funciona bien, entonces sabes que el problema está en tu código Swift y probablemente estará conectado a esto.
Además, si proporciona QUÉ realmente ralentiza su tiempo de compilación (porque puede ver todo el proceso de compilación con marcas de tiempo y hay una alta probabilidad de que un paso dure por mucho), puede ayudar a identificar el problema con mayor precisión.
¡Espero eso ayude!
Edición: Otro artículo sobre este tema interesado.