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.)


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).


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.


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


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.


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.


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


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


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 :).


5

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


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.


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.


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


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.


-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).


Xcode = Aucun gestionnaire de paquets
prêt à l'emploi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.