94 votes

Comment définir un point d'arrêt conditionnel dans Xcode basé sur la propriété d'une chaîne d'objets ?

Je cherche à faire en sorte que le débogueur s'interrompe lorsqu'il atteint une correspondance de chaîne particulière. Par exemple, je pourrais avoir quelque chose comme ceci :

Foo myObj = [self gimmeObj];

myObj peut avoir une propriété appelée name . Je veux que le débogueur s'arrête sur l'affectation quand

[myObj.name isEqualToString:@"Bar"];

Comment puis-je définir mon point d'arrêt conditionnel dans Xcode pour faire cela ?

189voto

Peter N Lewis Points 12025

Vous pouvez définir un point d'arrêt conditionnel dans Xcode en définissant le point d'arrêt normalement, puis en contrôlant-cliquant dessus et en sélectionnant Edit Breakpoint (choisissez Run -> Show -> Breakpoints).

Dans l'entrée du point d'arrêt, il y a une colonne Condition.

Maintenant, il y a plusieurs problèmes à garder à l'esprit pour la condition. Premièrement, gdb ne comprend pas la syntaxe du point, donc au lieu de myObj.name, vous devez utiliser [myObj name] (sauf si le nom est un ivar).

Ensuite, comme pour la plupart des expressions dans gdb, vous devez lui indiquer le type de résultat de retour, à savoir "BOOL". Donc, définissez une condition comme :

(BOOL)[[myObj name] isEqualToString:@"Bar"]

Il est souvent plus facile de faire cela dans le code en ajoutant temporairement du code comme :

if ( [myObj.name isEqualToString:@"Bar"] ) {
    NSLog( @"here" );
}

et ensuite mettre le point de rupture sur le NSLog. Ainsi, votre condition peut être arbitrairement complexe sans avoir à vous soucier de ce que gdb peut ou ne peut pas analyser.

7voto

Adam Rosenfield Points 176408

Je ne sais pas si cela va fonctionner, mais vous pouvez essayer de placer un point d'arrêt à cette ligne de code, ouvrir la console du débogueur (Cmd+Shift+R), et taper

condition N (int)[[myObj name] isEqualToString:@"Bar"]

Où N est remplacé par le numéro du point d'arrêt (un nombre entier).

2voto

Barry Wark Points 73462

Si vous modifiez monObj.name à l'aide du paramètre, vous pouvez ajouter un point d'arrêt symbolique sur -[MyObjClass setName:] soit depuis la console du débogueur, soit depuis le menu Exécuter->Gérer les points d'arrêt->Ajouter un point d'arrêt symbolique dans Xcode. Si ce n'est pas le cas (pourquoi ? vous ne devriez probablement pas modifier la variable d'instance directement, sauf dans l'initialisateur ou le dealloc désigné), vous pouvez définir un point de surveillance dans gdb (utilisez la console du débogueur dans Xcode une fois le débogueur lancé). Ce site explique comment. Je ne pense pas que Xcode expose une interface utilisateur pour définir des points de surveillance sans utiliser la console du débogueur.

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