Comment définir un point d’arrêt conditionnel dans Xcode basé sur une propriété de chaîne d’object?

Je cherche à faire en sorte que le débogueur soit interrompu lorsqu’il atteint une chaîne donnée. 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 isEqualToSsortingng:@"Bar"]; 

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

Vous pouvez définir un point d’arrêt conditionnel dans Xcode en définissant le point d’arrêt normalement, puis cliquez dessus avec le bouton droit de la souris et sélectionnez Modifier le point d’arrêt (choisissez Exécuter -> Afficher -> Points d’arrêt).

Dans l’entrée du point d’arrêt, il existe une colonne Condition.

Maintenant, il y a plusieurs problèmes à garder à l’esprit pour la condition. Tout d’abord, gdb ne comprend pas la syntaxe à points, donc au lieu de myObj.name, vous devez utiliser [myObj name] (à moins que name soit un ivar).

Ensuite, comme avec la plupart des expressions de gdb, vous devez lui indiquer le type de résultat de retour, à savoir “BOOL”. Alors définissez une condition comme:

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

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

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

puis en définissant le point d’arrêt sur le NSLog. Votre condition peut alors être complexe sans avoir à vous soucier de ce que gdb peut et ne peut pas parsingr.

Je ne sais pas si cela fonctionnera, mais vous pouvez essayer de définir un point d’arrêt à cette ligne de code, ouvrez la console du débogueur (Cmd + Shift + R) et tapez

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

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

Voici comment vous utilisez les points d’arrêt conditionnels XCode lldb.

D’abord, double-cliquez sur le point d’arrêt (ou cliquez avec le bouton droit de la souris pour edit breakpoint ), vous pouvez voir une boîte de dialog contextuelle.

entrer la description de l'image ici

Voici ce que signifie cette option:

  1. Condition : Le point d’arrêt ne se déclenche que dans cette condition.
  2. Ignorer : la quantité de fois que la condition doit se rencontrer avant de déclencher le point d’arrêt
  3. Action : action exécutée après le point d’arrêt.
  4. Options : continuer automatiquement après l’évaluation des actions

Voici un résumé. Pour l’exemple ci-dessus dans l’image, cela signifie que lorsque la variable buildingId est égale à 13, casser ici. Si j’ajoute ignorer le temps à 1, alors il ignorera la première fois lorsque buildingId est égal à 13 et se cassera à la deuxième fois que la condition est remplie.

Pour les actions, lorsque vous appuyez sur Ajouter des actions, il y aura une liste de choix. Habituellement, je fais appel à la Debugger Command pour imprimer des variables que je dois vérifier et je crois qu’il existe de meilleures façons d’utiliser les actions que je fais.

Il semble que vous devez recomstackr et exécuter l’application si vous modifiez les conditions à l’exécution

Si vous modifiez myObj.name en utilisant le setter, vous pouvez append un point d’arrêt symbolique sur -[MyObjClass setName:] à partir de la console du débogueur ou du -[MyObjClass setName:] > Gérer les points d’ -[MyObjClass setName:] > Ajouter un point d’arrêt symbolique dans Xcode. Sinon (pourquoi pas? Vous ne devriez probablement pas modifier directement la variable d’instance sauf dans l’initialiseur ou le dealloc), vous pouvez définir un sharepoint contrôle dans gdb (utilisez la console du débogueur dans Xcode une fois le débogueur en cours d’exécution). Cette page explique comment. Je ne crois pas que Xcode expose une interface utilisateur pour définir des points de surveillance sans utiliser la console de débogage.

Parfois, lorsque vous travaillez avec Frameworks (versions de débogage) et que vous avez besoin de placer un point d’arrêt dans un fichier ou un emplacement difficile à naviguer ou qu’il ne soit pas exposé publiquement dans une infrastructure en cours de développement. Une option consiste à écrire une classe d’assistance pour déclencher des points d’arrêt conditionnels et faciliter les étapes.

 - (void)invokeFrameworkMethod { ... [DebugConditionalBreakPointHelper breakPointCondition:YES comment:@"from invokeFrameworkMethod."]; ... } 

Déclaration d’en-tête dans le cadre en cours de développement.

 #import  @interface DebugConditionalBreakPointHelper : NSObject + (void)breakPointCondition:(BOOL)enabled comment:(NSSsortingng *)comment; @end 

Et fichier d’implémentation:

 #import "DebugConditionalBreakPointHelper.h" @implementation DebugConditionalBreakPointHelper + (void)breakPointCondition:(BOOL)enabled comment:(NSSsortingng *)comment { if (enabled) { NSLog(@"Triggerred Conditional Break Point. Comment: %@"); } } @end