El 'Nombre del proyecto' se compiló con optimización: los pasos pueden comportarse de manera extraña; las variables pueden no estar disponibles

211

Intentar ingresar al código de AFNetworking genera la siguiente advertencia:

[Project Name] was compiled with optimization - stepping may behave oddly; variables may not be available.

Y, por supuesto, no puedo depurar el código. Para ser específico, estoy tratando de depurar la UIImageView+AFNetworkingcategoría que parece imposible. Cambiar el código no tiene ningún efecto (intentado NSLog, etc.) y cuando intenta ingresar a los compiladores va al código de ensamblaje y se muestra UIImageView+TVASTAFNetworkingcomo un nombre de categoría que no existe en ninguna parte de la base del código.

ingrese la descripción de la imagen aquí

Uso de Xcode 7. iOS 9 y 8. Cocoapods (sin marco)

ACTUALIZACIÓN Olvidé mencionar que Optimizer está configurado para la configuración nonede lanzamiento y depuración y de hecho estoy usando Debugconfig.

ingrese la descripción de la imagen aquí

ACTUALIZACIÓN 2

Strip Debug Symbols Está apagado también.

Mojtaba
fuente
Recuerdo que había una especie de opción de "Eliminar símbolos de depuración". Eso probablemente causaría este problema. ¿Está apagado?
NadieNada
1
@NobodyNada Sí Strip Debug Symbolsestá apagado.
Mojtaba
Extraño Intenté activar el Símbolo de depuración de la tira, y la advertencia desapareció 8- |
Gomino
@ Mojtaba Hola, ¿descubriste cómo resolver el problema? Estoy atrapado con el mismo problema desde que actualicé a Xcode 7
Hadu
@Hadu: Desafortunadamente no
Mojtaba

Respuestas:

176

Si su proyecto está utilizando Swift, hay dos configuraciones separadas de "Nivel de optimización" en la configuración del proyecto / destino.

Asegúrese de configurarlos correctamente:

  1. Seleccione su proyecto en el panel Navegador de proyectos
  2. Seleccione la configuración de su proyecto en el árbol "PROYECTO"
  3. Haga clic en la pestaña "Configuración de compilación"
  4. Busque "Nivel de optimización" y verá dos configuraciones, una para LLVM y otra para Swift.
  5. Establezca la configuración adecuada ( None [-O0]para LLVM y None [-0none]Swift) para la configuración de compilación en cuestión.

fue compilado con pasos de optimización puede comportarse de manera extraña, las variables pueden no estar disponibles

Hacer esto resolvió esa advertencia para mí.

Albert Bori
fuente
1
¿Qué pasa con los proyectos de idiomas mixtos ...?
Vive el
¿Cuál es la diferencia entre LLVM y Swift? ¿Es que Swift es lo que escribí en el proyecto y LLVM es para lo que estoy haciendo en lo que respecta a la depuración en el depurador es decir cosas como po, p, expr...?
Miel
124

Parece que su proyecto está en modo Release. El modo de lanzamiento compila la aplicación con muchas optimizaciones, pero los depuradores odian las optimizaciones, por lo que para depurar de manera confiable la aplicación, debe cambiarla al modo de depuración que reduce la optimización y agrega un montón de información de depuración. Para cambiarlo al modo de depuración:

  • Haga clic en su esquema en la esquina superior izquierda de Xcode.

Haga clic en su esquema en la esquina superior izquierda de Xcode.

  • Seleccione "Editar esquema ..."

Seleccione "Editar esquema ..."

  • Haga clic en el menú desplegable "Configuración de compilación". y cámbielo al modo de depuración.

Haga clic en el menú desplegable "Configuración de compilación".

NadieNada
fuente
8
Estoy usando depuración. y seguro optimizador está apagado.
Mojtaba
Esto fue interesante. Además, debido a que lo configuré en el modo de Liberación , algunos de mis puntos de interrupción no fueron alcanzados mientras que otros fueron golpeados ¯_ (ツ) _ / ¯
Miel
60

Esta advertencia solo aparece cuando alcanza un punto de interrupción y la fuente está en un proyecto donde la optimización está habilitada, evitando que vea valores de variables reales (cada objeto se muestra como nulo, incluso si no lo está)

En mi caso, solo sucedió al depurar paso a paso a través de una dependencia de cocoapod.

Por lo tanto, incluso si tiene su objetivo principal y la configuración del proyecto configurados correctamente (Símbolo de depuración de tira = DESACTIVADO y Nivel de optimización Ninguno), debe asegurarse de que sea el mismo para el proyecto Pod desde el que está llegando al punto de interrupción.

ingrese la descripción de la imagen aquí

Gomino
fuente
Lea otras respuestas, están sugiriendo lo mismo. pero todos están fuera de mi proyecto (aka None [-O0])
Mojtaba
2
Sé que dijiste que está apagado en tu proyecto, al igual que en el mío, pero ¿echaste un vistazo a la configuración de tus proyectos de dependencias de Pod?
Gomino
El mismo problema aquí con Xcode 7. Probablemente el problema apareció cuando comencé a usar la biblioteca trachkerbird. Pero el punto de interrupción está dentro de mi propio código.
Mike
1
Para el proyecto Pods, cambie la configuración del nivel de optimización "PROYECTO" a Ninguno funciona. (sin cambios para ningún objetivo de pod).
ooops
2
Esto es incorrecto. Se anulará cuando vuelvas pod install. Cámbialo así .
Iulian Onofrei
13

Resulta que después de importar un proyecto antiguo (Xcode 7.x +) a un nuevo Xcode 8.3 (8E162), probablemente debido a la optimización del compilador, el Compilador Swift - Nivel de optimización se configuró por defecto en Optimización rápida de un solo archivo :

antes de

Cambiándolo a ninguno, resolvió el problema:

después

valvolina
fuente
Lo hice. No funcionó para mí. Estoy enfrentando este problema en la compilación ios que es generada por Unity.
Chandni
11

Editor-> Validate Settingsluego confirma todos los cambios. Entonces deberías obtenerNivel de optimización del compilador rápido en su lugar

Establezca Depuración en None.

james sa
fuente
1
Lo hice. No funcionó para mí. Estoy enfrentando este problema en la compilación ios que es generada por Unity.
Chandni
9

Esta fue la solución para mí ...

En la línea de la respuesta de gimino, si está utilizando cocoapods, agregue una línea como esta al Podfile:

xcodeproj 'MyProject', 'Debug - local'=>:debug, 'Debug - staging'=>:debug, 'Debug - PRODUCTION'=>:debug

o para versiones de cocoapods> = 1.0 (gracias Diejmon)

project 'MyProject', 'Debug - local'=>:debug, 'Debug - staging'=>:debug, 'Debug - PRODUCTION'=>:debug

Donde MyProject tiene 'Debug - local', 'Debug - staging', 'Debug - PRODUCTION' como configuraciones de depuración además del estándar 'Debug'

De forma predeterminada, los cocoapods generalmente generarán configuraciones de pod como Release, esta línea de Podfile le permite decirle que son depuración.

wils
fuente
9

Me encontré con el mismo problema hoy, y lo descubrí (al menos en mi caso). También estoy usando CocoaPods, y estaba teniendo este problema al ejecutar mi objetivo de prueba (Swift mezclado con ObjC).

Estoy usando Xcode 7.2, con iOS 9.2 SDK.

En la imagen a continuación, puede ver las optimizaciones para el objetivo y el proyecto antes de mi cambio:

nivel de optimización antes del cambio

Lo sorprendente es que, aunque la optimización resuelta es Ninguna [-O0] , solo después de cambiar la configuración del proyecto de -Os a -O0 el compilador dejó de optimizar el objetivo.

A continuación puedes ver mi configuración final:

nivel de optimización después del cambio

André Neves
fuente
7

Ha pasado mucho tiempo, pero finalmente resolví el problema. Hay un tercer indicador de optimización LTOo Link Time Optimizatione Sorprendentemente nadie habría mencionado aquí y por alguna razón que no prestó atención a ella tampoco. Está justo encima de la Optimization Levelconfiguración, como puede ver en muchas capturas de pantalla publicadas aquí.

Para resumirlo, hay 3 indicadores de optimización diferentes que desea desactivar para la depuración:

  • Optimización del tiempo de enlace de LLVM (-flto )
  • Nivel de optimización de LLVM (-O )
  • Nivel de optimización del compilador rápido

ingrese la descripción de la imagen aquí

Más información sobre LTO: http://llvm.org/docs/LinkTimeOptimization.html

Mojtaba
fuente
2
Lo hice. No funcionó para mí. Estoy enfrentando este problema en la compilación ios que es generada por Unity.
Chandni
@Chandni, aquí me enfrenté al mismo problema, ¿encontraste la solución?
Ranjani
2

Si necesita deshabilitar las optimizaciones para sus módulos Swift para poder depurarlos, agregue lo siguiente a su Podfile. Esto deshabilitará las optimizaciones solo para compilaciones de depuración.

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      if config.name == "Debug"
        config.build_settings["SWIFT_OPTIMIZATION_LEVEL"] = "-Onone"
      end
    end
  end
end
Al sacerdote
fuente
1

¿Está seguro de que su configuración de depuración no optimiza el código (no debería)? Parece que accidentalmente ha habilitado optimizaciones para la configuración de depuración y debe desactivarlo desde la configuración del objetivo.

Can Poyrazoğlu
fuente
3
La optimización está desactivada para todo. incluso lanzar build solo para asegurarse
Mojtaba
@Mojtba ¡Pero el modo de lanzamiento activa las optimizaciones!
NobodyNada
0

Este error me ocurrió dos veces, y en todos los casos fue un error en el parámetro de URL utilizado para solicitar un servicio. En un caso, la URL tenía algo de espacio en la sección del puerto, en el otro caso, algún valor opcional no se estaba desenvolviendo.

Entonces, la solución fue asegurarse de que la URL de la solicitud esté bien formada. Más información sobre mi caso e informes similares aquí .

le0diaz
fuente
0

Todo lo que hice fue limpiar ( Product > Clean) mi proyecto y ejecutarlo nuevamente

raed
fuente
0

Esto puede ser una simplificación excesiva, pero ¿está compilando para Release o con optimización (que elimina los símbolos de Swift o LLVM) demasiado alta? Si es así, edite su esquema y cambie a Depurar, o edite su Configuración de compilación para la optimización rápida o LLVM a Ninguno (0).

Aaron
fuente
0

En caso de que alguien se enfrente a este problema mientras depura un pod que usa una biblioteca C internamente, hay otra cosa que debe cambiar en la configuración del proyecto para que funcione además de todo lo demás enumerado en el hilo.

Vaya a la configuración del proyecto Pods -> Su objetivo de uso de C -> Configuración de compilación -> Apple Clang - Banderas personalizadas del compilador -> Otras banderas de C y elimine la -O3bandera que llegó allí de alguna manera.

Dmitry Serov
fuente