Depurador de Xcode: ver el valor de la variable


107

Mi código en un UITableViewController:

delegate.myData = [myData objectAtIndex:indexPath.row];

¿Cómo puedo ver los valores de delegate.myDatao indexPath.rowen el depurador? delegate.myDatadebe ser una matriz y indexPath.rowun int. Sólo puedo ver las direcciones de memoria de los objetos delegatey indexPath¿pero dónde están myDatay row?

texto alternativo

Respuestas:


142

Compruebe esto ¿Cómo ver el contenido de la variable NSDictionary en el depurador de Xcode?

Yo tambien uso

po variableName
print variableName

en Console.

En su caso es posible ejecutar

print [myData objectAtIndex:indexPath.row]  

o

po [myData objectAtIndex:indexPath.row]

¡Gracias! Intento mucho: "print [myData objectAtIndex: indexPath.row]", "po [myData objectAtIndex: indexPath.row]", "print indexPath.row", "po indexPath.row", ... Pero cada vez que recibió el mensaje "No hay ningún miembro llamado fila". Esto funciona: "print indexPath" y "po indexPath". Así que intenté usar "[]" en lugar de ".": "Po [fila de ruta de índice]" -> "No se puede imprimir la descripción de un objeto NIL". "po [indexPath getRow]" -> "El destino no responde a este selector de mensajes". :-(
Manni

4
intente imprimir (int) [fila indexPath]
Andriy

po [myData objectAtIndex: (int) [indexPath row]]
Andriy

@VanDuTran Estoy bastante seguro de que el equivalente a po objen swift es po print(obj).
Chris

Esto también fue perfecto para encontrar valores de propiedades calculados. ¡Gracias!
Paula Hasstenteufel

25

Estoy de acuerdo con otros carteles en que Xcode, como entorno de desarrollo, debería incluir una forma fácil de depurar variables. Bueno, buenas noticias, ¡HAY una!

Después de buscar y no encontrar una respuesta / tutorial simple sobre cómo depurar variables en Xcode, fui a explorar con Xcode y encontré este descubrimiento (al menos para mí) muy útil.

Cómo depurar fácilmente sus variables en Xcode 4.6.3

En la pantalla principal de Xcode, asegúrese de ver el área de depuración inferior haciendo clic en el botón de la esquina superior derecha que se muestra en la captura de pantalla.

Botón de área de depuración

Área de depuración en Xcode 4.6.3

Ahora establezca un Punto de interrupción: la línea en su código donde desea que su programa se detenga, haciendo clic en el borde de su Área de código.

Breakpoint

Ahora, en el Área de depuración, busque estos botones y haga clic en el del medio. Notará que su área ahora está dividida en dos.

Área de depuración dividida

Debería verse así

Ahora ejecute su aplicación.

Cuando se alcanza el primer punto de interrupción durante la ejecución de su programa, verá en el lado izquierdo todas las variables disponibles en ese punto de interrupción.

Campo de búsqueda

Puede expandir las flechas hacia la izquierda en la variable para obtener más detalles. E incluso use el campo de búsqueda para aislar la variable que desea y ver cómo cambia en tiempo real a medida que "ingresa" al alcance del Breakpoint.

Entrar en

En el lado derecho de su Área de depuración, puede enviar a imprimir las variables que desee usando el botón derecho del mouse, haga clic sobre la variable deseada.

Menú contextual

Como puede ver, ese menú contextual está lleno de opciones de depuración muy interesantes. Como Watch que ya se ha sugerido con comandos escritos o incluso Edit Value ... ¡ que cambia el valor de tiempo de ejecución de su variable!


21

Tambien tu puedes:

  1. Establezca un punto de interrupción para pausar la ejecución.
  2. El objeto debe estar dentro del alcance de ejecución
  3. Mueva el puntero del mouse sobre el objeto o la variable
  4. Aparecerá una información sobre herramientas amarilla
  5. Mueva el mouse sobre la información sobre herramientas
  6. Haga clic sobre las dos pequeñas flechas que apuntan hacia arriba y hacia abajo
  7. Aparecerá un menú contextual
  8. Seleccione "Imprimir descripción", ejecutará una [descripción del objeto]
  9. La descripción aparecerá en la salida de la consola.

En mi humilde opinión, un poco escondido y engorroso ...


En mi xcode, la "Descripción de impresión" no funciona, entonces, ¿cómo puedo habilitarla?
Kirtikumar A.

@kirtiavaiya la aplicación debe estar en pausa y su variable debe estar dentro del alcance actual para ser impresa. Además, no puede imprimir "self.variable" directamente, pero puede usar la solución de Andriy para imprimir _ <nombre de la variable>. Por ejemplo: para self.btnHello escriba en la consola "po _btnHello" (esto solo funciona si no ha cambiado el nombre del método getter)
LightMan

@LightMan sí, es como dijiste, pero tampoco funciona
Kirtikumar A.

10

Tu confusión se debe al hecho de que propiedades declaradas no son (necesariamente nombradas igual que) (instancia) variables.

La expresion

indexPath.row

es equivalente a

[indexPath row]

y la tarea

delegate.myData = [myData objectAtIndex:indexPath.row];

es equivalente a

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

asumiendo nombres estándar para propiedades sintetizadas.

Además, delegateprobablemente se declara como de tipo id<SomeProtocol>, es decir, el compilador no ha podido proporcionar información de tipo real delegateen ese momento, y el depurador se basa en la información proporcionada en tiempo de compilación. Dado que ides un tipo genérico, no hay información en tiempo de compilación sobre las variables de instancia en delegate.

Esas son las razones por las que no ve myDatao rowcomo variables.

Si desea inspeccionar el resultado del envío -rowo -myData, puede usar comandos po po:

p (NSInteger)[indexPath row]
po [delegate myData]

o use la ventana de expresiones (por ejemplo, si sabe que su tipo delegatees real MyClass *, puede agregar una expresión (MyClass *)delegate, o hacer clic con el botón derecho delegate, elegir View Value as…y escribir el tipo real de delegate(por ejemplo MyClass *).

Dicho esto, estoy de acuerdo en que el depurador podría ser más útil:

  • Podría haber una opción para decirle a la ventana del depurador que use información de tipo de tiempo de ejecución en lugar de información de tiempo de compilación. Ralentizaría el depurador, por supuesto, pero proporcionaría información útil;

  • Las propiedades declaradas podrían mostrarse en un grupo llamado propiedades y permitir la inspección (opcional) directamente en la ventana del depurador. Esto también ralentizaría el depurador debido a la necesidad de enviar un mensaje / ejecutar un método para obtener información, pero también proporcionaría información útil.


¡Gracias por su explicación! ¡Esto me ha ayudado un montón! :-)
Manni

7

Puede imprimir valores en la ventana de la consola en tiempo de ejecución. A continuación se muestran los pasos:

  1. Coloque un punto de ruptura para el que desea obtener valores
  2. Ahora realice la depuración paso a paso.
  3. Coloque un cursor en la variable / delegado cuyo valor se comprobará en tiempo de ejecución.
  4. Ahora esto mostrará la descripción de la variable / delegado
  5. Al hacer clic en "i" se mostrará una descripción detallada
  6. Esto también imprimirá detalles en la ventana de la consola.

Captura de pantalla para imprimir detalles en la ventana de la consola


1
¿Funciona esto en Swift, soy nuevo en Swift? No puedo ver los valores del objeto como solíamos ver en obj c.
umairhhhs

1
@umairhhhs Esta publicación es solo para Objective-C.
Jayprakash Dubey

1
Me pregunto por qué esto no está en el editor rápido porque fue una función de gran ayuda y ahorro de tiempo.
umairhhhs

1

Esto se complica un poco. Estos objetos son clases o estructuras personalizadas, y mirar dentro de ellos no es tan fácil en Xcode como en otros entornos de desarrollo.

Si yo fuera usted, NSLog los valores que desea ver, con alguna descripción.

es decir:

NSLog(@"Description of object & time: %i", indexPath.row);

11
Sí, NSLog es una posibilidad, pero no una alternativa cómoda a la depuración. Estoy muy sorprendido de que no haya forma de mostrar los valores deseados. Eso pertenece a la funcionalidad básica de un entorno de desarrollo.
Manni

2
Lo más exasperante de XCode. Patético.
ryan0

1

Prueba Ejecutar-> Mostrar-> Expresiones

Ingrese el nombre de la matriz o lo que esté buscando.


¡Gracias! Ingresé "indexPath.row" y "delegate.myData" en la ventana de expresión, pero cada vez aparece "fuera de alcance" en la columna "Resumen" :-(
Manni

np, tuve el mismo problema hasta que lo encontré;)
tbone

1
establezca un punto de interrupción justo después de establecer su matriz o lo que sea y debería encontrar el valor en Expresiones. Buena suerte
tbone
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.