debugging - how - `po` da` error:<EXPR>: 1: 1: error: uso de identificador no resuelto`
how to debug in swift xcode (6)
Apuesto a que ese error se debe al hecho de que
foo
se ha optimizado durante la compilación y su símbolo ya no existe en el código compilado (incluso si no debería tener una depuración y sigue siendo un error de LLDB)
Probablemente si agrega algún uso de
foo
en las siguientes líneas (incluso una impresión), su símbolo se mantendrá en el IR y podrá
po foo
(Estoy de acuerdo en que sigue siendo un error, pero al menos si funciona, tendrá una solución alternativa y algún sentido de explicación)
Tengo este problema con
po
en la consola donde tratar de generar una función funciona en sí mismo, pero la salida de una variable o constante no lo hace.
Como puede ver aquí, aunque podría pensar que var / let contiene el contenido de
bar.boy()
, Swift de alguna manera no puede encontrarlo ...
Configuré Swift Complier en "-O"
SWIFT_OPTIMIZATION_LEVEL = "-O";
y vuelva a configurarlo en "-Onone".
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
Entonces funciona.
Encontré un problema similar pero ya tenía la configuración correcta, todas las optimizaciones establecidas en
None
.
Sin embargo, todavía no obtuve ningún valor.
Después de investigar más, descubrí que el problema se originó porque Xcode no pudo resolver los tipos:
(lldb) frame variable self
<could not resolve type>
Eso me llevó a esta pregunta: xcode 8 Debugger ''No se pudo resolver el tipo'' donde se describe el problema y el encabezado de puente parece causar problemas.
Con mi proyecto sin encabezados de puente, estudié la configuración de compilación una vez más y encontré esta configuración
Esto se estableció inicialmente en
YES
.
Después de cambiarlo a
NO
símbolos vuelven a funcionar.
SWIFT_INSTALL_OBJC_HEADER = NO
Resulta que probablemente hubo un error en el pasado que cuando agregaba un archivo Swift agregaría / solicitaría un encabezado Bridging, pero no agregaría esa línea a su proyecto
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
lo que significa que te quedarías en este estado
resultando en un
error: <EXPR>:1:1: error: use of unresolved identifier
!
Solo pude descubrir eso porque moví los archivos en mi proyecto y cuando agregué archivos ObjC al proyecto, me preguntó sobre un encabezado Bridging (¡aunque ya tenía uno!) Y afortunadamente agregó
SWIFT_OPTIMIZATION_LEVEL
.
Uno podría considerar que es un error para considerar que el valor predeterminado es el
fastest
, pero de nuevo supongo que esto fue solo un error en el pasado y se solucionó ahora.
Aún así, arreglé ahora que podría ser un error al revés, si no agrega
none
en la versión de lanzamiento.
No puedo probar esto ahora porque para probar esto solo tuve una compilación de
Debug
.
Lo dejaré como ejercicio :) para los ingenieros de Apple.
Si su proyecto está usando Swift, hay dos configuraciones separadas de "Nivel de optimización" en la configuración del proyecto / destino. No es solo "SWIFT_OPTIMIZATION_LEVEL". Consulte este enlace: https://.com/a/32984193/2060180
Lo dejaré aquí en caso de que sea útil para alguien.
Solucionado después de la configuración:
Optimization Level = None[-Onone]
en
Swift Compiler - Generación de código
Tenga en cuenta que la configuración del
Optimization Level
en
Apple LLVM 8.0 - Generación de código
no tiene ningún efecto