Comment changer la valeur des variables lors du débogage avec LLDB dans Xcode?

173

Dans Xcode, GDB vous permet de changer les variables locales pendant le débogage (voir comment changer la valeur de NSString pendant le débogage dans XCode? ). LLDB offre-t-il une fonctionnalité similaire? Si oui, comment pouvons-nous l'utiliser?

Eric
la source
1
Assurez-vous de voir le débogage avancé dans iOS . C'est génial
Honey
J'essaie de définir une propriété d'objets, qui fonctionne si la longueur de la chaîne est comprise entre 0 et 15 caractères. La définition d'une chaîne de 16 caractères ou plus est acceptée, mais lorsque je la réimprime, elle me montre une chaîne absurde: po myObj.someString = "1234567890123456", ce qui fonctionne, mais lorsque j'imprime, j'obtiens (String? $ R68 = " \ 0 \ 0 \ 0 \ 0 @ \ a \ u {1} \ c {5} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ "
Nick Wright

Réponses:

267
expr myString = @"Foo"

(lldb) help expr
Évalue une expression C / ObjC / C ++ dans le contexte actuel du programme, en utilisant les variables actuellement dans la portée. Cette commande prend une entrée «brute» (pas besoin de citer des éléments).

Syntaxe: expression -

Utilisation des options de commande: expression [-f] [-G] [-d] [-u] - expression [-o] [-d] [-u] - expression

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

Exemples:

expr ma_structure-> a = mon_array [3]
expr -f bin - (index * 8) + 5
expr char c [] = "toto"; c [0]

REMARQUE IMPORTANTE: Étant donné que cette commande prend une entrée «brute», si vous utilisez des options de commande, vous devez utiliser «-» entre la fin des options de commande et le début de l'entrée brute.

'expr' est une abréviation pour 'expression'

Matthias Bauch
la source
1
En effet, merci! Encore une petite question: je fais ça pour essayer de changer le texte d'un UILabel: 'expr myLabel.text = @"hello!"mais j'obtiens un error: property 'text' not found on object of type 'UILabel *'... Des pensées?
Eric
10
expr (void)[label setText:@"Foo"]devrait le faire. Dot-Syntax ne fonctionnera généralement pas dans le débogueur. lldb l'interprète probablement comme vous vouliez accéder à un membre d'un c-struct, mais je ne suis pas sûr que ce soit la raison pour laquelle cela ne fonctionnera pas. Dot-Syntax ne fonctionne pas non poplus. au lieu de po label.textvous devez utiliserpo [label text]
Matthias Bauch
4
En fait, lldb gère bien mieux la syntaxe des points que gdb. gdb suppose simplement que vous le traitez comme un C-struct, ce qui échoue. lldb accédera correctement aux propriétés, mais seulement si elles sont réellement déclarées avec @property.
BJ Homer
28
Vous pouvez également utiliser pcomme raccourci pour expr. Exemple:(lldb) p url = @"http://google.com"
funroll
11
Vous pouvez également utiliser ecomme raccourci pour expr. BTW, pest un alias pour print qui est un alias pour expr --(juste évaluer l'entrée brute, pas de drapeaux) expr -o -- [object]ou poqui vous donne généralement une sortie plus utile pour les objets.
Jason Newell
21

Les trucs suivants fonctionnent pour moi. J'utilise Xcode 8.

Si vous souhaitez définir une variable (par exemple un "dict") sur nil, puis tester le flux de code, vous pouvez essayer ce qui suit.

  1. Placez le point d'arrêt correctement après avoir été initialisé à la valeur souhaitée.
  2. puis exécutez "expression dict = nil" dans la ligne de commande lldb pour le modifier. (par exemple "nil")
  3. Passez au-dessus du point de rupture.
  4. Vérifiez la variable "dict" dans la ligne suivante. Ce sera nul.

Cela ressemblera à quelque chose comme dans la console.

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

Si vous utilisez Xcode 10 ou 11, placez correctement le point d'arrêt après avoir initialisé la variable requise, vous pouvez modifier votre variable en utilisant po myString = "Hello World"facilement.

atalayasa
la source