181 votes

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

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

1 votes

Ne manquez pas de voir Débogage avancé dans iOS . C'est génial

0 votes

J'essaie de définir une propriété d'objet, 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 l'imprime, j'obtiens une chaîne sans queue ni tête : 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\ "

280voto

Matthias Bauch Points 52145
expr myString = @"Foo"

(lldb) help expr
Évaluer une expression en C/ObjC/C++ contexte actuel du programme, en utilisant les variables en cours d'exécution. Cette commande prend une entrée "brute" (pas besoin de guillemets).

Syntaxe : expression --

Options de la commande Utilisation : 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 my_struct->a = my_array[3]
expr -f bin -- (index * 8) + 5
expr char c[] = "foo" ; c[0]

REMARQUE IMPORTANTE : Comme cette commande prend des données "brutes", si vous utilisez des options de commande, vous devez utiliser ' -- ' entre la fin des options de commande et le début des données brutes. et le début de l'entrée brute.

expr" est l'abréviation de "expression".

1 votes

En effet, merci ! Encore une petite question : Je fais cela pour essayer de changer le texte d'un UILabel : 'expr myLabel.text = @"hello!" mais je reçois un error: property 'text' not found on object of type 'UILabel *' ... Des idées ?

10 votes

expr (void)[label setText:@"Foo"] devrait le faire. Dot-Syntax ne fonctionne généralement pas dans le débogueur. lldb l'interprète probablement comme si vous vouliez accéder à un membre d'une structure c, mais je ne suis pas sûr que ce soit la raison pour laquelle cela ne fonctionne pas. La syntaxe pointée ne fonctionne pas pour po soit. au lieu de po label.text vous devez utiliser po [label text]

4 votes

En fait, lldb gère la syntaxe des points bien mieux que gdb. gdb suppose que vous la traitez comme une structure C, ce qui échoue. lldb accède correctement aux propriétés, mais seulement si elles sont effectivement déclarées avec la balise @property .

23voto

arango_86 Points 1

Les éléments suivants fonctionnent pour moi. J'utilise Xcode 8.

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

  1. Placez le point d'arrêt correctement après l'avoir initialisé à la valeur souhaitée.
  2. puis exécuter "expression dict = nil" dans la ligne de commande de lldb pour le modifier. (par exemple "nil")
  3. Franchir le point de rupture.
  4. Vérifiez la variable "dict" dans la ligne suivante. Elle sera nulle.

Elle ressemblera à la console.

(lldb) expression dict = nil
(NSDictionary *) $5 = nil

6voto

Atalay Asa Points 138

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X