Le débogueur Xcode n'imprime pas les objets et affiche nil, quand ils ne le sont pas

165

Xcode affiche une erreur lors de la tentative d'impression d'un objet avec po <objectName>, mais uniquement pour un projet.

Capture d'écran

erreur: impossible de matérialiser la structure: la taille de la variable <varName> n'est pas d'accord avec la taille de ValueObject Erreur dans Execute, impossible de PrepareToExecuteJITExpression

Le débogueur Xcode affiche également TOUS les objets comme nil( selfexclus), lorsqu'ils ne le sont pas ( NSLogaffiche la sortie correcte, comme indiqué dans l'image). Je ne sais pas ce qui ne va pas avec le projet. Tous les autres projets fonctionnent bien.

Avez-vous des idées de ce que ça pourrait être? (Le nettoyage du projet n'a eu aucun effet.)

Binaire
la source
Pour moi, cela ressemble à une sorte de problème de pointeur, mais je suis sûr d'être honnête. Qu'essayez-vous de faire / d'accomplir?
user2967030
3
L'erreur se produit sur chaque objet de ce projet. Même NSStrings a créé une ligne au-dessus du point d'arrêt!
Binarian
1
Comme dit dans la question, le nettoyage ne change rien; (, mais merci d'avoir essayé. Ajout du message d'erreur.
Binarian
3
Êtes-vous sûr que vous construisez sans optimisations? (-O0)
iccir
1
Les optimisations peuvent être définies non seulement dans les paramètres du projet, mais également dans les cibles. Il y avait m coincé :(
basilic

Réponses:

269

Etes-vous sûr de ne pas être en "mode Release"?

Si vous voulez voir les valeurs des variables, vous devez être en "Mode débogage" (cliquez sur le nom de votre projet dans le coin supérieur gauche près des boutons de démarrage / arrêt, puis "Modifier le schéma ...", puis "Exécuter" les paramètres, puis " Onglet Info ", puis" Build Configuration ". Ici, définissez" Debug ". Si c'était sur" Release "c'est le problème que vous avez vu tous les nils).

Mick
la source
3
Je n'ai qu'une seule configuration, comment changer la configuration pour qu'elle ressemble à un debug configuration?
Binarian
2
Ah ok, j'ai créé un projet vide et je peux maintenant voir toutes les différences dans le Build Settings, la propriété de déploiement a Strip debug symbols during copyété définie sur YES.
Binarian
16
@ Alex1987 Je mets Strip debug symbols during copyà NOet Optimization Levelà None -O0dans le projetBuild Settings
Binarian
32
Malheureusement, dans certaines situations, lldb a fait cela en mode débogage, avec des optimisations désactivées et des symboles de débogage présents. Il est temps de visiter bug report.apple.com
ctpenrose
4
Eu le même problème - Le niveau d'optimisation était "Aucun". Le problème était que l'optimisation du temps de liaison (LTO) était définie sur "Oui" également pour le mode de débogage.
pi3
38

J'ai défini le "Niveau d'optimisation" pour la configuration de débogage sur "Aucun" et cela a résolu le problème.

Leszek Zarna
la source
2
C'est drôle, ça n'a pas marché. J'ai fait le contraire. Je suis passé Fastest, Smallest[-Os]et cela a fonctionné.
Nate Hat
Beaucoup de suggestions différentes, mais celle-ci (définir l'optimisation de débogage sur Aucune) l'a corrigée pour moi.
Dejal
29

Assurez-vous que Address Sanitizer est désactivé dans les paramètres de votre programme. Address Sanitizer ne fonctionne pas correctement avec le débogueur.

  1. Accédez à Modifier le schéma (Produit >> Schéma >> Modifier le schéma), choisissez Exécuter et accédez à l'onglet Diagnostics.
  2. Assurez-vous que «Activer le désinfectant d'adresse» est désactivé.

entrez la description de l'image ici

KIO
la source
4
C'était la solution pour moi. Apparemment, il y a de nombreuses raisons pour lesquelles cela peut arriver.
manroe du
16

Il semble que chacun a sa propre solution.

Pour moi, j'utilise Objective-Cet Swiften même temps.

Tout d'abord, allez à TARGETS -> Build Settingset recherchez lecode generation

Vous trouverez Apple LLVM 6.0 et Swift Compiler

Changer leur Optimization Leveltout en None, puis Debug, vous pouvez trouver la valeur nonnil

Étonnamment, une fois que vous pouvez voir la valeur, vous résolvez ce problème de manière permanente, puis vous pouvez changer la valeur Optimization Levelqu'il était auparavant.

LeiHao
la source
11

Cela peut se produire d’autres façons. Pour moi, c'était parce que la valeur «Other C Flags» était définie sur «-O2», même pour la version de débogage. La désactivation de cette option pour la version de débogage a résolu le problème.

ThomasW
la source
9

Sortie de débogage filtrée

Pour moi, Xcode filtrait la sortie du débogueur. Assurez-vous que votre paramètre de sortie est Sortie du débogueur ou Toutes les sorties

Curmudgeonlybumbly
la source
6

Je viens de rencontrer ce problème et j'ai constaté que c'était parce que Deployment Postprocessing = YESdans les paramètres de construction.

Changer cela pour le NOcorriger, comme le montre la capture d'écran ci-dessous:

entrez la description de l'image ici

Version Xcode: 6.0.1 (6A317) sur OSX 10.9.5

Luke
la source
5

Je viens de rencontrer un problème similaire: à un moment donné, le débogueur Xcode a soudainement imprimé certains types d'objets, en particulier NSStrings, comme (null) bien qu'ils aient été initialisés avec une valeur. Imprimé via

NSLog(@"String value: %@", myString);

la valeur correcte de l'objet a été affichée.

Déroutant! Résoudre le problème était assez simple: j'ai juste arrêté Xcode et redémarré mon ordinateur. Après avoir redémarré Xcode, tout fonctionne à nouveau bien :).

Torsten Barthel
la source
5

Assurez-vous que Link-Time Optimization = Nopour le mode débogage dans les paramètres de construction.

lama591
la source
Je viens de rencontrer ce problème dans Xcode 8 uniquement sur mes paramètres de construction de cadre dynamique! Thx
vmeyer
3
  1. Supprimer les données dérivées
  2. Tout à fait Xcode / Redémarrer
  3. Projet propre

C'est tout ce qu'il a fallu pour moi.

TMin
la source
2

Les solutions ici corrigent également le bogue que vous voyez error: <EXPR>:1:1: error: use of unresolved identifierchaque fois que vous essayez poune variable.

Pour moi, la solution était d'aller Build Settingschercher Optimization Levelet de s'assurer que chaque Debugparamètre était défini sur None.

Kevin Xu
la source
Cela a en fait résolu le problème pour moi. Une idée de l'inconvénient de la désactivation du paramètre?
Jasper
1

Accédez à "Autres indicateurs C" dans le paramètre de construction et définissez la valeur de débogage de -o2 à -O0

Shauket Sheikh
la source
0

J'ai également rencontré cela et quand j'ai découvert que j'étais en mode de libération, je passe au débogage ... pas de solution. Il s'avère que je devais d'abord faire un nettoyage (cmd + shift + k).

Donc je pense que ce qui se passe, c'est qu'après le mode release intégré, tout n'est pas recompilé dans develop et donc lldb ne peut pas lire correctement les symboles. Après le nettoyage et la recompilation en développement, cela a fonctionné pour moi.

Spencer Hall
la source
-3

La réalité est que le système devrait fonctionner hors de la boîte et n'est pas dû à des liens vers une quantité multiple de paramètres différents, à un point tel que les choses peuvent fonctionner pour vous, ou non.

Pourquoi le système ne permet-il pas toujours de déboguer en mode débogage est un mystère auquel seul Apple peut répondre (s'ils s'en soucient, ce que je doute dernièrement).

Après tout, la différence entre debug / non-debug serait des tables supplémentaires avec des métadonnées qui ne remplissent que l'espace mémoire / disque.

Si vous compilez directement avec le simulateur ou un appareil, vous ne vous soucierez pas de ces mégaoctets supplémentaires.

Nous devons donc lancer des boucles supplémentaires pour faire une chose très basique et simple que toutes les idées que je connais depuis le siècle dernier font très bien.

Et pour ajouter, pour moi, ce qui a fonctionné était de changer sur "Debug" l'optimisation Link-Time de "Monolithic" à "No" (xcode 8).

kindaian
la source
Xcode = Aucun gestionnaire de paquets
prêt à l'emploi