ios xcode swift crash lldb

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: 11

Tiempo 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_NOTIFY

Regiones 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.