web-dev-qa-db-fra.com

Xcode Debugger: voir la valeur de la variable

Mon code dans un UITableViewController:

delegate.myData = [myData objectAtIndex:indexPath.row];

Comment puis-je voir les valeurs de delegate.myData ou indexPath.row dans le débogueur? delegate.myData devrait être un tableau et indexPath.row un int. Je ne peux voir que les adresses mémoire des objets delegate et indexPath, mais où sont myData et row?

alt text

96
Manni

Vérifiez ceci Comment afficher le contenu de la variable NSDictionary dans le débogueur Xcode?

J'utilise aussi

po variableName
print variableName

en console.

Dans votre cas, il est possible d'exécuter

print [myData objectAtIndex:indexPath.row]  

ou

po [myData objectAtIndex:indexPath.row]
132
Andriy

Je suis d'accord avec d'autres affiches pour dire que Xcode, en tant qu'environnement de développement, devrait inclure un moyen simple de déboguer des variables. Eh bien, bonne nouvelle, il y a IS un!

Après avoir cherché et non trouvé une simple réponse/tutoriel sur la manière de déboguer des variables dans Xcode, je suis allé explorer avec Xcode lui-même et ai trouvé cette découverte (du moins pour moi) très utile.

Comment déboguer facilement vos variables dans Xcode 4.6.

Dans l'écran principal de Xcode, assurez-vous de voir la zone de débogage en bas en cliquant sur le bouton situé dans le coin supérieur droit de la capture d'écran.

Debug Area button

Debug Area in Xcode 4.6.3

Définissez maintenant un point d'arrêt - la ligne de votre code à l'endroit où vous souhaitez que votre programme fasse une pause, en cliquant sur la bordure de votre zone de code.

Breakpoint

Maintenant dans la zone de débogage, recherchez ces boutons et cliquez sur celui du milieu. Vous remarquerez que votre région est maintenant divisée en deux.

Split Debug Area

Should look like this

Maintenant, lancez votre application.

Lorsque le premier point d'arrêt est atteint pendant l'exécution de votre programme, vous verrez à gauche toutes les variables disponibles à ce point d'arrêt.

Search Field

Vous pouvez développer les flèches de gauche sur la variable pour plus de détails. Et même utilisez le champ de recherche pour isoler la variable souhaitée et la voir changer en temps réel au fur et à mesure que vous entrez dans la portée du point d'arrêt.

Step Into

Sur le côté droit de votre zone de débogage, vous pouvez envoyer pour imprimer les variables comme bon vous semble en cliquant avec le bouton droit de la souris sur la variable souhaitée.

Contextual Menu

Comme vous pouvez le constater, ce menu contextuel regorge d’options de débogage très intéressantes. Tels que Regardez ce qui a déjà été suggéré avec des commandes typées ou même Modifier la valeur… qui change la valeur d'exécution de votre variable!

22
Lex L.

Aussi, vous pouvez:

  1. Définissez un point d'arrêt pour suspendre l'exécution.
  2. L'objet doit être à l'intérieur de la portée d'exécution
  3. Déplacez le pointeur de la souris sur l'objet ou la variable
  4. Une info-bulle jaune apparaîtra
  5. Déplacez la souris sur l'info-bulle
  6. Cliquez sur les deux petites flèches pointant vers le haut et le bas
  7. Un menu contextuel apparaîtra
  8. Sélectionnez "Imprimer la description", il exécutera une [description d'objet]
  9. La description apparaîtra dans la sortie de la console

IMHO un peu caché et encombrant ...

19
LightMan

Votre confusion provient du fait que les propriétés déclarées ne sont pas (nécessairement nommées de la même manière que) (instance) variables.

L'expresion

indexPath.row

est équivalent à

[indexPath row]

et la mission

delegate.myData = [myData objectAtIndex:indexPath.row];

est équivalent à

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

en supposant une dénomination standard pour les propriétés synthétisées.

De plus, delegate est probablement déclaré comme étant du type id<SomeProtocol>, C'est-à-dire que le compilateur n'a pas été en mesure de fournir les informations de type réelles pour delegate à ce moment-là, s'appuie sur les informations fournies au moment de la compilation. Comme id est un type générique, il n’ya pas d’information de compilation sur les variables d’instance dans delegate.

C’est la raison pour laquelle vous ne voyez pas myData ou row en tant que variables.

Si vous voulez vérifier le résultat de l'envoi de -row Ou -myData, Vous pouvez utiliser les commandes p ou po:

p (NSInteger)[indexPath row]
po [delegate myData]

ou utilisez la fenêtre d'expressions (par exemple, si vous savez que votre delegate est de type réel MyClass *, vous pouvez ajouter une expression (MyClass *)delegate ou cliquer avec le bouton droit de la souris sur delegate, choisissez View Value as… et tapez le type réel de delegate (par exemple MyClass *).

Cela étant dit, je conviens que le débogueur pourrait être plus utile:

  • Il pourrait y avoir une option pour indiquer à la fenêtre de débogueur d'utiliser des informations de type au moment de l'exécution au lieu des informations de compilation. Cela ralentirait le débogueur, bien sûr, mais fournirait des informations utiles;

  • Les propriétés déclarées peuvent être affichées dans un groupe appelé propriétés et permettre une inspection (facultative) directement dans la fenêtre du débogueur. Cela ralentirait également le débogueur en raison de la nécessité d'envoyer un message/d'exécuter une méthode afin d'obtenir des informations, mais fournirait également des informations utiles.

9
user557219

Vous pouvez imprimer des valeurs sur la fenêtre de la console au moment de l'exécution. Voici les étapes:

  1. Placez un point de rupture pour lequel vous voulez obtenir des valeurs
  2. Maintenant, effectuez un débogage étape par étape.
  3. Placez un curseur sur la variable/le délégué dont la valeur doit être vérifiée au moment de l'exécution.
  4. Maintenant, cela montrera la description de la variable/délégué
  5. Cliquez sur "i" pour afficher une description détaillée.
  6. Cela va également imprimer les détails sur la fenêtre de la console.

Screenshot for printing details on console window

6
Jayprakash Dubey

Essayez Exécuter-> Afficher-> Expressions

Entrez le nom du tableau ou celui que vous cherchiez.

1
tbone

Cela devient un peu compliqué. Ces objets sont des classes ou des structures personnalisées, et regarder à l'intérieur de ceux-ci n'est pas aussi facile sous Xcode que dans d'autres environnements de développement.

Si j'étais vous, NSLog les valeurs que vous voulez voir, avec une description.

c'est à dire:

NSLog(@"Description of object & time: %i", indexPath.row);
1
Aurum Aquila