2010-07-14 12 views
8

Dans sa configuration par défaut (ie, my), Xcode n'est pas très utile dans sa fenêtre de débogage pour les variables, en particulier celles de la variété de collections Objective-C commune. Le débogueur semble généralement vouloir afficher la structure Obj-C sous-jacente lorsque je développe un objet, donc je regarde isa s et la hiérarchie des classes.Contenu de variable Obj-C intelligent lors du débogage dans Xcode?

Mais ce que j'ai presque veux toujours ici est quelque chose de sémantiquement significatif pour l'objet lui-même. Par exemple. pour un NSDictionary, je voudrais idéalement voir une liste de clés/valeurs. Si ces clés et valeurs sont, par exemple NSString s, je veux juste voir les valeurs de chaîne, pas les objets imbriqués complexes. Idem pour NSSet s, NSArrays, et les octets à l'intérieur d'un NSData. Et NSString s, tout en obtenant généralement leur représentation de chaîne dans la colonne Résumé, sont impossibles à regarder quand ils sont longs (par exemple, un chemin qui est trop long pour tenir dans la colonne ne semble pas défiler) - quand je double- cliquez dessus, je reçois la chaîne de modèle d'affichage à la place, donc je ne peux pas sélectionner/copier non plus. J'ai récemment passé du temps dans le débogage Java d'Eclipse, et pour toutes ses failles, Eclipse connaît toutes les collections Java, et a une simple vidage sur une ligne du contenu d'une chaîne ou collection ou autre quand vous trouvez dans le débogueur.

Existe-t-il un moyen d'obtenir ceci dans Xcode? Ai-je manqué quelque chose d'évident, ou devrais-je plonger dans le système de modèle d'affichage? Je sais qu'il y a un certain soutien là-bas, car NSArrays semble obtenir un format listy spécial, NSDictionaries obtenir un résumé "2 paires clé/valeur", etc

EDIT: Il est possible de déposer dans GDB pour obtenir plus de données sur objets. Je suis découragé que po de GDB agissant sur un NSDictionary donne le genre de sortie awesomely utile que j'attends d'un débogueur d'interface graphique. Est-ce que ceci peut être répliqué sans changement de contexte à la console? J'apprécie énormément l'environnement Xcode, mais l'opacité presque complète des objets que j'utilise tout le temps nuit vraiment au temps de débogage. Merci.

+0

Si je vous comprends bien, je pense que ce serait une grande caractéristique (si elle existe I voulez savoir aussi) - mais cela ne devrait pas empêcher le débogage, car la console gdb et toute sa gloire CLI sont disponibles pour vider tout ce dont vous avez besoin. :) – Eric

Répondre

1

Dans Xcode 6, cette fonctionnalité semble avoir été implémentée? Je ne peux pas parler aux caractéristiques de Xcode quand cette question a été posée en 2010.

NSString, NSNumber, NSArray et NSDictionary valeurs dans votre code, avec un point d'arrêt:

variables in code

Lorsque les pauses breakpoint , vous pouvez voir les valeurs dans la "Vue Variables" de Xcode. Pour les collections, vous devrez peut-être développer les détails arrow:

values in the debugger

Si vous cliquez droit sur une variable et sélectionnez "Print Description of variable_name", -debugDescription/valeur -description de l'objet sera imprimé à la console. Cela est souvent utile pour les collections plus complexes, et peut-être pour de longues NSString valeurs etc

Screen shot in Xcode 7 of “Print Description” context-menu item

printed to the console.

+2

Oui, et merci pour la réponse mise à jour. Xcode a lentement progressé dans ces améliorations de l'affichage par défaut au cours des dernières années - en 2010, il était choquant à quel point les défauts étaient utiles. –

+0

Existe-t-il un raccourci clavier pour l'élément de menu contextuel 'Imprimer la description'? –

4

Oui, la recherche de variables XCode au cours du déboguage est faible, mais elle est basée sur gdb et vous pouvez le contrôler en pensant à la console. Pendant le débogage ouvrez la console et écrivez n'importe quelle commande dont vous avez besoin, pour voir le NSDictionary * dic; le contenu, il est aussi simple que

po dic 

imprime des données po telles qu'elles sont présentées dans le résultat [description obj]. Vous pouvez également appeler des méthodes comme

po [dict valueForKey:@"myKey"], or p(NSRect) [[self view] frame] 

Vous pouvez obtenir plus gdb aide

+0

+1 Merci Gobra. Je vais éditer la question pour souligner que j'espère des solutions sans ligne de commande, mais je comprends que ce soit la meilleure solution, malheureusement. –

+0

Le fait de cliquer avec le bouton droit sur une variable dans le volet Variables de la fenêtre du débogueur complet affiche une commande "Imprimer la description de la console", qui équivaut à "po". (Ceci appelle réellement '-debugDescription', qui appelle par défaut' -description', mais est surchargé pour fournir des informations plus détaillées, par exemple, des collections.) –

4

je regardais à la fois la sortie GDB spéciale (comme Gobra noté), mais aussi les modèles d'affichage.

L'étoffe d'affichage semble complexe, mais est en fait assez simple - est ici un exemple pour l'affichage makign de NSIndexPath « Sec: x Row: y »:

Sec:{(int)[$VAR section]} Row:{(int)[$VAR row]} 

Vous pouvez donc imprimer un texte descriptif et plusieurs valeurs pour tout type d'objet. Les variables d'affichage fonctionnent pour toutes les classes de ce type et persistent entre les exécutions XCode et entre projets.

Une dernière chose délicate à noter est que pour tout ce qui renvoie une chaîne, vous devez ajouter un « : s » après le « {} » paire comme ceci:

{[myClass description]}:s 

Si vous devez effacer un modèle d'affichage, il suffit de cliquer sur la ligne pour éditer et effacer tout - vous revenez à la valeur par défaut. Il est donc très facile de créer rapidement des formateurs temporaires pour n'importe quel objet qui vous permet de voir exactement ce qui vous intéresse.

Questions connexes