77 votes

Comment appeler des méthodes ou d'exécuter du code dans LLDB débogueur?

Je sais que je peux le type print someFloatVariable lorsque j'ai mis un point d'arrêt ou po [self someIvarHoldingAnObject], mais je ne peux pas faire des choses utiles comme:

[self setAlpha:1];

Puis il crache:

erreur: '[auto " n'est pas une commande valide.

Bizarre, c'est que je peux appeler po [self someIvarHoldingAnObject] et il va imprimer sa description.

Je crois que j'en ai vu une vidéo il y a un an où quelqu'un vous a montré comment exécuter du code par le biais de la console lors de l'exécution, et si je ne me trompe pas ce gars-là a également fourni des arguments et des objets affectés à des pointeurs. Comment faire?

127voto

Jason Molenda Points 5171

L'canonique de référence pour gdb v. lldb commandes est http://lldb.llvm.org/lldb-gdb.html

Vous souhaitez utiliser la commande expr qui évalue une expression. C'est l'un des lldb commandes qui prend des "premières entrées" en plus d'arguments donc vous avez souvent besoin d'un "--" pour indiquer où les arguments (pour expr) end et les commande(s) de commencer. par exemple

(lldb) expr -- [self setAlpha:1]

Il y a un raccourci, "p", ce qui ne l' -- pour vous (mais ne permet pas d'arguments), par exemple

(lldb) p [self setAlpha:1]

Si la fonction(s) que vous êtes d'appel ne font pas partie de votre programme, vous aurez souvent besoin de déclarer explicitement leur type de retour de sorte lldb sait comment les appeler. par exemple

(lldb) p printf("hi\n")
error: 'printf' has unknown return type; cast the call to its declared return type
error: 1 errors parsing expression
(lldb) p (int)printf("hi\n")
(int) $0 = 3
hi
(lldb)

Il est un moyen sympa de travailler autour de la virgule flottante argument problème, BTW. Vous créez une "expression préfixe de fichier" qui est ajouté à chaque expression que vous entrez dans lldb, avec un prototype de vos méthodes de la classe. Par exemple, j'ai une classe Maclasse qui hérite de NSObject, il dispose de deux méthodes de l'intérêt", setArg:" et "getArg" qui à définir et à obtenir un flotteur ivar. C'est un drôle de petit exemple, mais il montre comment l'utiliser. Voici un préfixe de fichier que j'ai écrit pour lldb:

@interface NSObject
@end
@interface MyClass : NSObject
- init;
- setArg: (float)arg;
- (float) getArg;
@end

extern "C" {
  int strcmp (const char *, const char *);
  void printf (const char *, ...);
  void puts (const char *);
}

dans mon ~/.lldbinit fiche je ajouter

settings set target.expr-prefix /Users/jason/lldb-prefix.h

et maintenant je peux le faire

(lldb)    p [var getArg]
(float) $0 = 0.5
(lldb)    p [var setArg:0.7]
(id) $1 = 0x0000000100104740
(lldb)    p [var getArg]
(float) $2 = 0.7

Vous remarquerez que j'y ai inclus un couple de fonctions de la bibliothèque C standard ici. Après avoir fait cela, je n'ai pas besoin de jeter les types de retour de ces plus, par exemple

(lldb) p printf("HI\n")
<no result>
HI
(lldb) p strcmp ("HI", "THERE")
(int) $3 = -12

(un correctif pour que les "<aucun résultat>" chose a été commis à l'lldb TOT sources déjà.)

L'inconvénient ici est que l' settings set target.expr-prefix ligne actuellement, ne peuvent pas utiliser un nom de fichier avec un ~ en elle. C'était juste fixé dans le lldb sources, v. http://lists.cs.uiuc.edu/pipermail/lldb-commits/Week-of-Mon-20121008/006716.html - mais pour l'instant, à l'aide de Xcode 4.5, spécifiez un chemin d'accès au fichier qui n'utilise pas d' ~.

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