¿Cómo cambiar el valor de las variables mientras se depura con LLDB en Xcode?

173

En Xcode, GDB le permite cambiar las variables locales durante la depuración (vea cómo cambiar el valor de NSString durante la depuración en XCode? ). ¿LLDB ofrece una funcionalidad similar? Si es así, ¿cómo podemos usarlo?

Eric
fuente
1
Asegúrese de ver Depuración avanzada en iOS . Es increíble
Honey
Estoy tratando de establecer una propiedad de objetos, que funciona si la longitud de la cadena está entre 0-15 caracteres. Se acepta establecer una cadena de 16 o más caracteres, pero cuando la imprimo de nuevo, me muestra una cadena sin sentido: po myObj.someString = "1234567890123456", que funciona, pero cuando imprimo me sale (String? $ R68 = " \ 0 \ 0 \ 0 \ 0 @ \ a \ u {1} \ c {5} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ "
Nick Wright

Respuestas:

267
expr myString = @"Foo"

(lldb) help expr
Evalúa una expresión C / ObjC / C ++ en el contexto actual del programa, usando variables actualmente en alcance. Este comando toma la entrada 'en bruto' (no es necesario citar cosas).

Sintaxis: expresión -

Uso de opciones de comando: expresión [-f] [-G] [-d] [-u] - expresión [-o] [-d] [-u] - expresión

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

   -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.

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

Ejemplos:

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

NOTA IMPORTANTE: Debido a que este comando toma una entrada 'sin procesar', si usa alguna opción de comando, debe usar '-' entre el final de las opciones del comando y el comienzo de la entrada sin procesar.

'expr' es una abreviatura de 'expresión'

Matthias Bauch
fuente
1
De hecho, gracias! Una pequeña pregunta más: estoy haciendo esto para tratar de cambiar el texto de un UILabel: 'expr myLabel.text = @"hello!"pero me sale un error: property 'text' not found on object of type 'UILabel *'... ¿Alguna idea?
Eric
10
expr (void)[label setText:@"Foo"]Deberías hacerlo. La sintaxis de puntos generalmente no funcionará en el depurador. Probablemente, lldb lo interpreta como si quisieras acceder a un miembro de una estructura c, pero no estoy seguro de si esta es la razón por la que no funcionará. La sintaxis de puntos tampoco funciona po. en lugar de po label.texttener que usarpo [label text]
Matthias Bauch
44
En realidad, lldb maneja la sintaxis de puntos mucho mejor que gdb. gdb simplemente asume que lo estás tratando como una estructura C, que falla. lldb accederá correctamente a las propiedades, pero solo si en realidad se declaran con @property.
BJ Homer
28
También puede usarlo pcomo atajo para expr. Ejemplo:(lldb) p url = @"http://google.com"
funroll
11
También puede usarlo ecomo atajo para expr. Por cierto, pes un alias para imprimir que es un alias para expr --(solo evaluar la entrada sin formato, sin banderas) expr -o -- [object]o, en pogeneral, le brinda una salida más útil para los objetos.
Jason Newell
21

Lo siguiente me funciona. Estoy usando Xcode 8.

Si desea establecer alguna variable (por ejemplo, un "dict") en cero y luego probar el flujo del código, puede intentar lo siguiente.

  1. Coloque el punto de interrupción correctamente después de inicializado al valor deseado.
  2. luego ejecute "expression dict = nil" en la línea de comando lldb para cambiarlo. (por ejemplo "nulo")
  3. Paso sobre el punto de quiebre.
  4. Verifique la variable "dict" en la siguiente línea. Será nulo.

Se verá algo así como en la consola.

(lldb) expression dict = nil
(NSDictionary *) $5 = nil
arango_86
fuente
3

Si está utilizando Xcode 10 u 11, coloque el punto de interrupción correctamente después de inicializado a la variable requerida, entonces puede cambiar su variable po myString = "Hello World"fácilmente.

atalayasa
fuente