Como alterar o valor das variáveis ​​durante a depuração com LLDB no Xcode?

173

No Xcode, o GDB permite alterar variáveis ​​locais durante a depuração (veja como alterar o valor NSString durante a depuração no XCode? ). O LLDB oferece uma funcionalidade semelhante? Se sim, como podemos usá-lo?

Eric
fonte
Certifique-se de ver Depuração avançada no iOS . É incrível
Mel
Estou tentando definir uma propriedade de objetos, que funciona se o comprimento da string estiver entre 0 e 15 caracteres. A definição de uma sequência de 16 ou mais caracteres é aceita, mas quando a imprimo, ela mostra uma sequência sem sentido: po myObj.someString = "1234567890123456", que funciona, mas quando imprimo recebo (String? $ R68 = " \ 0 \ 0 \ 0 \ 0 @ \ a \ u {1} \ c {5} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ "
Nick Wright

Respostas:

267
expr myString = @"Foo"

(lldb) ajuda a expr
Avalie uma expressão C / ObjC / C ++ no contexto atual do programa, usando variáveis ​​atualmente no escopo. Este comando recebe entrada 'bruta' (não é necessário citar coisas).

Sintaxe: expressão -

Uso das opções de comando: expressão [-f] [-G] [-d] [-u] - expressão [-o] [-d] [-u] - expressão

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

Exemplos:

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

NOTA IMPORTANTE: Como esse comando recebe a entrada 'bruta', se você usa alguma opção de comando, deve usar '-' entre o final das opções de comando e o início da entrada bruta.

'expr' é uma abreviação de 'expression'

Matthias Bauch
fonte
1
De fato, obrigado! Mais uma pequena pergunta: estou fazendo isso para tentar alterar o texto de um UILabel: 'expr myLabel.text = @"hello!"mas recebo uma error: property 'text' not found on object of type 'UILabel *'... Alguma idéia?
Eric
10
expr (void)[label setText:@"Foo"]deve fazê-lo. A sintaxe de pontos geralmente não funciona no depurador. O lldb provavelmente o interpreta como você deseja acessar um membro de um c-struct, mas não tenho certeza se esse é o motivo pelo qual não funcionará. A sintaxe de pontos também não funciona po. em vez de po label.textvocê ter que usarpo [label text]
Matthias Bauch
4
Na verdade, o lldb lida com a sintaxe de pontos muito melhor que o gdb. O gdb apenas supõe que você o esteja tratando como uma estrutura C, que falha. O lldb acessará corretamente as propriedades, mas somente se elas forem realmente declaradas com @property.
BJ Homer
28
Você também pode usar pcomo um atalho para expr. Exemplo:(lldb) p url = @"http://google.com"
funroll 16/09
11
Você também pode usar ecomo um atalho para expr. BTW, pé um apelido para impressão, que é um apelido para expr --(apenas avaliar entrada bruta, sem sinalizadores) expr -o -- [object]ou pogeralmente fornece uma saída mais útil para objetos.
Jason Newell
21

O seguinte material funciona para mim. Estou usando o Xcode 8.

Se você deseja definir alguma variável (por exemplo, um "dict") para zero e testar o fluxo de código, tente o seguinte.

  1. Coloque o ponto de interrupção corretamente depois de inicializado com o valor desejado.
  2. em seguida, execute "expression dict = nil" na linha de comando do lldb para alterá-lo. (por exemplo "nulo")
  3. Passe por cima do ponto de interrupção.
  4. Verifique a variável "dict" na próxima linha. Será nulo.

Será algo como no console.

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

Se você estiver usando o Xcode 10 ou 11, coloque o ponto de interrupção corretamente depois de inicializado na variável necessária, poderá alterar sua variável po myString = "Hello World"facilmente.

atalayasa
fonte