El depurador Xcode no imprime objetos y muestra nulo, cuando no lo están

165

Xcode muestra un error al intentar imprimir un objeto con po <objectName>, pero solo para un proyecto.

Captura de pantalla

error: no se pudo materializar struct: el tamaño de la variable <varName> no está de acuerdo con el tamaño del ValueObject Errado en Execute, no se pudo PrepararExecuteJITExpression

El depurador Xcode también muestra TODOS los objetos como nil( selfexcluidos), cuando no lo están ( NSLogmuestra la salida correcta, como se ve en la imagen). No sé qué tiene de malo el proyecto. Todos los demás proyectos funcionan bien.

¿Alguna idea de que podría ser? (La limpieza del proyecto no tuvo ningún efecto).

Binario
fuente
Para mí suena como una especie de problema de puntero, pero estoy seguro de que soy sincero. ¿Qué estás tratando de hacer / lograr?
user2967030
3
El error ocurre en cada objeto de ese proyecto. ¡Incluso se NSStringcreó una línea por encima del punto de interrupción!
Binario
1
Como se dijo en la pregunta, la limpieza no cambia nada; (pero gracias por intentarlo. Se agregó el mensaje de error.
Binarian
3
¿Estás seguro de que estás construyendo sin optimizaciones? (-O0)
iccir
1
Las optimizaciones se pueden establecer no solo en la configuración del proyecto sino también en los objetivos. Había m atascado :(
albahaca

Respuestas:

269

¿Estás seguro de que no estás en "Modo de lanzamiento"?

Si desea ver valores variables, debe estar en "Modo de depuración" (haga clic en el nombre de su proyecto en la esquina superior izquierda cerca de los botones de inicio / detención, luego "Editar esquema ...", luego "Ejecutar", luego " Pestaña "Información", luego "Configuración de compilación". Aquí establezca "Depurar". Si estaba en "Liberar", ese es el asunto que vio todos nulos).

Mick
fuente
3
Solo tengo una configuración, ¿cómo cambiar la configuración para que sea como una debug configuration?
Binario
2
Ah ok, creé un proyecto vacío y ahora puedo ver todas las diferencias en el Build Settings, la propiedad de implementación Strip debug symbols during copyse estableció en SÍ.
Binario
16
@ Alex1987 me puse Strip debug symbols during copya NOy de la Optimization Levelque None -O0en el proyectoBuild Settings
Binarian
32
Desafortunadamente, en ciertas situaciones, lldb ha estado haciendo esto en modo de depuración, con optimizaciones desactivadas y símbolos de depuración presentes. Hora de visitar bug report.apple.com
ctpenrose
44
Tuve el mismo problema: el nivel de optimización era "Ninguno". El problema fue que Link-Time Optimization (LTO) se configuró en "Sí" también para el modo de depuración.
pi3
38

Establecí el "Nivel de optimización" para la configuración de depuración en "Ninguno" y resolvió el problema.

Leszek Zarna
fuente
2
Gracioso, eso no funcionó. Yo hice lo contrario. Me cambié Fastest, Smallest[-Os]y funcionó.
Nate Hat
Muchas sugerencias diferentes, pero esta (estableciendo la optimización de depuración en Ninguna) me lo arregló.
Dejal
29

Asegúrese de que Address Sanitizer esté desactivado en la configuración de Scheme. Address Sanitizer no funciona bien con el depurador.

  1. Vaya a Editar esquema (Producto >> Esquema >> Editar esquema), elija Ejecutar y vaya a la pestaña Diagnóstico.
  2. Asegúrese de que "Activar desinfectante de direcciones" esté desactivado.

ingrese la descripción de la imagen aquí

KIO
fuente
44
Esta fue la solución para mí. Aparentemente, hay muchas razones por las que esto puede suceder.
manroe
16

Parece que todos tienen su propia solución.

Para mí, uso Objective-Cy Swiftal mismo tiempo.

En primer lugar, vaya TARGETS -> Build Settingsy busque elcode generation

Encontrarás Apple LLVM 6.0 y Swift Compiler

Cambie Optimization Leveltodo a None, luego Depuración, puede encontrar el valor nonil

Sorprendentemente, una vez que puede ver el valor, resuelve este problema permanentemente, luego puede cambiar el valor Optimization Levelque solía ser.

LeiHao
fuente
11

Hay otras formas en que esto puede ocurrir. Para mí fue porque el valor "Otros C Flags" se estableció en "-O2", incluso para la compilación de depuración. Desactivar esto para la compilación de depuración resolvió el problema.

ThomasW
fuente
9

Salida de depuración filtrada

Para mí, Xcode estaba filtrando la salida del depurador. Asegúrese de que su configuración de salida sea Salida del depurador o Toda la salida

Curmudgeonlybumbly
fuente
6

Acabo de encontrar este problema y descubrí que era porque Deployment Postprocessing = YESen la Configuración de compilación.

Cambiando esto para NOarreglarlo, como se ve en la siguiente captura de pantalla:

ingrese la descripción de la imagen aquí

Versión de Xcode: 6.0.1 (6A317) en OSX 10.9.5

Luke
fuente
5

Acabo de encontrarme con un problema similar: en un momento, el depurador de Xcode imprimió algunos tipos de objetos, especialmente NSStrings, como (nulo) aunque se inicializaron con un valor. Impreso a través de

NSLog(@"String value: %@", myString);

Se mostró el valor correcto para el objeto.

¡Confuso! Resolver el problema fue bastante fácil: simplemente apagué Xcode y reinicié mi computadora. Después de reiniciar Xcode, todo vuelve a funcionar bien :).

Torsten Barthel
fuente
5

Asegúrese Link-Time Optimization = Nodel modo de depuración en la Configuración de compilación.

llama591
fuente
¡Acabo de resolver este problema en Xcode 8 solo en mi configuración de compilación de marco dinámico! Thx
vmeyer
3
  1. Eliminar datos derivados
  2. Muy Xcode / Reiniciar
  3. Proyecto limpio

Eso es todo lo que me costó.

TMin
fuente
2

Las soluciones aquí también solucionarán el error donde ves error: <EXPR>:1:1: error: use of unresolved identifiercada vez que intentas con pouna variable.

Para mí, la solución era ir a Build Settingsbuscar Optimization Levely asegurarme de que cada Debugconfiguración estaba configurada en None.

Kevin Xu
fuente
Esto realmente lo arregló para mí. ¿Alguna idea de cuál es el inconveniente de deshabilitar la configuración?
Jasper
1

Vaya a "Otros C Flags" en la configuración de compilación y establezca el valor de depuración de -o2 a -O0

Shauket Sheikh
fuente
0

También me he encontrado con esto y cuando descubrí que estaba en modo de liberación, cambié a depurar ... no hay solución. Resulta que primero tuve que hacer una limpieza (cmd + shift + k).

Entonces, creo que lo que sucede es que después del modo de lanzamiento integrado, no todo se vuelve a compilar en desarrollo y, por lo tanto, lldb no puede leer los símbolos correctamente. Después de limpiar y recompilar en desarrollo funcionó para mí.

Spencer Hall
fuente
-3

La realidad es que el sistema debería funcionar de inmediato y no se debe a enlaces a una cantidad múltiple de configuraciones diferentes, hasta el punto de que las cosas pueden funcionar para usted o no.

¿Por qué el sistema no siempre permite la depuración cuando está en modo de depuración? Es un misterio que solo Apple puede responder (si les importa, lo que tarde dudo que lo hagan).

Después de todo, la diferencia entre depurar / no depurar serían tablas adicionales con metadatos que solo llenan la memoria / espacio en disco.

Si está compilando directamente contra el simulador o un dispositivo, no le importará esos megabytes adicionales.

Por lo tanto, necesitamos ejecutar bucles adicionales para hacer algo muy básico y sencillo que todas las ideas que conozco desde el siglo pasado funcionan bien.

Y para agregar, para mí lo que funcionó fue cambiar en "Depurar" la optimización de tiempo de enlace de "Monolítico" a "No" (xcode 8).

un poco
fuente
Xcode = n gestor de paquetes fuera de la caja, autocompletar y otras características de trabajo de la voluntad, los tiempos de compilación son enormes, etc.
zirinisp