2011-01-28 10 views
45

Estoy trabajando en una aplicación de iPhone. Soy un desarrollador de Java a tiempo completo y estoy acostumbrado a usar Eclipse, donde puedo poner un punto de interrupción y detener el proceso. Luego, puedo escribir cualquier expresión que desee y Eclipse lo evaluará utilizando los valores desde ese punto en el proceso.Xcode evaluando expresiones durante la depuración

¿Hay alguna manera de hacerlo en Xcode? Quiero poder detenerme en un punto de interrupción y luego ingresar un código para evaluarlo. La consola gdb me permitirá hacer po (print-object), pero es muy limitada. ¿Alguna ayuda?

+0

¿Qué es "po"? La consola gdb te permitirá evaluar un gran conjunto de funciones arbitrarias. ¿En particular en qué intentas hacer? –

+3

"po" es objeto de impresión. Es la extensión de Apple a gcc que da como resultado el envío del mensaje * description * a una instancia ObjC para que devuelva su descripción. – diciu

+0

Ah, es por eso que no he oído hablar de eso. Divertido. –

Respuesta

40

mi práctica:

po [NSUserDefaults standardUserDefaults]

muestra: < NSUserDefaults: 0x6143040>

po [[NSUserDefaults standardUserDefaults] stringForKey:@"Currency"]

muestra: "CHF"

+3

Esta es la única respuesta que realmente responde la pregunta. Peter sugiere que utilice el comando 'po' en el indicador' (lldb) 'que está disponible en la consola de depuración cuando la ejecución fue detenida por el punto de corte del depurador. El póster original señala que ya usan 'po', pero al menos esto es un intento de responder la pregunta. –

+1

Al menos esta es una respuesta –

3
No es un

pregunta sobre Xcode, pero el código AppCode de JetBrains hace esto de la forma IDE estándar que la mayoría de nosotros conocemos de otras plataformas.

+0

Esto no responde a la pregunta sobre Xcode, pero no hay nada de malo con una ventaja en otro IDE. Gracias. –

14

Utilice el comando "expresión" en el depurador. Usarlo es relativamente simple. Simplemente escriba la expresión de comando y presione enter. Luego se le pedirá que ingrese una expresión. Aquí hay un ejemplo

(lldb) expression 
Enter expressions, then terminate with an empty line to evaluate: 
2+2 

(int) $2 = 4 

También adjunté la información de ayuda para el comando de expresión a continuación. Espero que esto ayude.

Evalúe una expresión C/ObjC/C++ en el contexto del programa actual, usando las variables y variables definidas por el usuario actualmente en el alcance. Este comando toma entrada 'en bruto' (no es necesario citar cosas).

Sintaxis: Expresión -

Opciones de comandos Uso: expresión [-f] [-G] [-a] [-d] [-t] [-u] - expresión [-o ] [-a] [-d] [-t] [-u] - expresión

-G <gdb-format> (--gdb-format <gdb-format>) 
     Specify a format using a GDB format specifier string. 

    -a <boolean> (--all-threads <boolean>) 
     Should we run all threads if the execution doesn't complete on one 
     thread. 

    -d <boolean> (--dynamic-value <boolean>) 
     Upcast the value resulting from the expression to its dynamic type 
     if available. 

    -f <format> (--format <format>) 
     Specify a format to be used for display. 

    -o (--object-description) 
     Print the object description of the value resulting from the 
     expression. 

    -t <unsigned-integer> (--timeout <unsigned-integer>) 
     Timeout value for running the expression. 

    -u <boolean> (--unwind-on-error <boolean>) 
     Clean up program state if the expression causes a crash, breakpoint 
     hit or signal. 

Tiempos de espera: Si la expresión se puede evaluar de forma estática (sin runnning código), entonces será. De lo contrario, de forma predeterminada, la expresión se ejecutará en la secuencia actual con un tiempo de espera corto: actualmente .25 segundos. Si no se devuelve en ese momento, la evaluación se interrumpirá y se reanudará con todos los subprocesos en ejecución. Puede usar la opción -a para deshabilitar el reintentamiento en todos los hilos . Puede usar la opción -t para establecer un tiempo de espera más corto.

Variables definidas por el usuario: Puede definir sus propias variables para mayor comodidad o para usarlas en expresiones posteriores. Los defina de la misma forma que definiría variables en C. Si el primer carácter de su variable definida por el usuario es $, el valor de la variable estará disponible en futuras expresiones , de lo contrario solo estará disponible en la expresión actual .

Ejemplos:

expr my_struct->a = my_array[3] 
    expr -f bin -- (index * 8) + 5 
    expr unsigned int $foo = 5 
    expr char c[] = "foo"; c[0] 

NOTA IMPORTANTE: Debido a que este comando toma de entrada 'en bruto', si se utiliza cualquier opciones de comando debe utilizar '-' entre el final de las opciones de comando y el comienzo de la entrada sin procesar.

63

En XCode 4.0 esto está oculto en la GUI. Cuando se encuentra en un punto de interrupción, probablemente pueda ver la Vista de variables dentro del Área de depuración; es el panel que muestra las variables locales y tal. Haga clic con el botón derecho en la Vista de variables y seleccione "Agregar expresión ..."

Me doy cuenta de que este es un hilo antiguo, pero sigue siendo uno de los principales de Google, así que pensé que valía la pena responder.

+0

Esta es la respuesta que es relevante ahora. Gracias –

+0

¡Agradable! No puedo creer que esta opción esté oculta tan profundamente –

+2

¡Esto merece más votos! –

Cuestiones relacionadas