«Nom du projet» a été compilé avec optimisation - le pas peut se comporter de façon étrange; les variables peuvent ne pas être disponibles

211

Essayer d'entrer dans le code AFNetworking génère l'avertissement suivant:

[Project Name] was compiled with optimization - stepping may behave oddly; variables may not be available.

Et bien sûr, je ne suis pas en mesure de déboguer le code. Pour être précis, j'essaie de déboguer une UIImageView+AFNetworkingcatégorie qui semble impossible. La modification du code n'a aucun effet (essayé NSLog, etc.) et lorsque vous essayez d'intervenir dans les compilateurs, vous accédez au code d'assembly et s'affiche UIImageView+TVASTAFNetworkingcomme un nom de catégorie qui n'existe nulle part dans la base de code.

entrez la description de l'image ici

Utilisation de Xcode 7. iOS 9 et 8. Cocoapods (pas de framework)

MISE À JOUR J'ai oublié de mentionner qu'Optimizer est configuré pour la configuration de nonelibération et de débogage et j'utilise en fait Debugconfig.

entrez la description de l'image ici

MISE À JOUR 2

Strip Debug Symbols Est également éteint.

Mojtaba
la source
Je me souviens qu'il y avait une sorte d'option "Strip Debug Symbols". Cela causerait probablement ce problème. C'est éteint?
NobodyNada
1
@NobodyNada Oui Strip Debug Symbolsest désactivé.
Mojtaba
Bizarre, j'ai juste essayé d'activer Strip Debug Symbol, et l'avertissement a disparu 8- |
Gomino
@Mojtaba Hé, avez-vous trouvé comment résoudre le problème? Je suis coincé avec le même problème depuis la mise à jour vers Xcode 7
Hadu
@Hadu: Malheureusement non
Mojtaba

Réponses:

176

Si votre projet utilise Swift, il existe deux paramètres distincts "Niveau d'optimisation" dans la configuration du projet / cible.

Assurez-vous de les définir correctement:

  1. Sélectionnez votre projet dans le volet Navigateur du projet
  2. Sélectionnez les paramètres de votre projet sous l'arborescence "PROJET"
  3. Cliquez sur l'onglet "Paramètres de construction"
  4. Recherchez «Optimization Level» et vous verrez deux paramètres, un pour LLVM et un pour swift.
  5. Définissez le paramètre approprié ( None [-O0]pour LLVM et None [-0none]pour Swift) pour la configuration de construction en question.

a été compilé avec optimisation pas à pas peut se comporter bizarrement les variables peuvent ne pas être disponibles

Faire cela a résolu cet avertissement pour moi.

Albert Bori
la source
1
Qu'en est-il des projets en langues mixtes ...?
Vive
Quelle est la différence entre LLVM et Swift? Est - ce que Swift est ce que je l' ai écrit dans le projet et LLVM est pour tout ce que je fais en ce qui concerne le débogage dans le débogueur -à- dire des choses comme po, p, expr...?
Honey
124

Il semble que votre projet soit en mode Release. Le mode Release compile l'application avec de nombreuses optimisations, mais les débogueurs détestent les optimisations, donc pour déboguer l'application de manière fiable, vous devez la mettre en mode Debug, ce qui réduit l'optimisation et ajoute un tas d'informations de débogage. Pour le basculer en mode débogage:

  • Cliquez sur votre schéma dans le coin supérieur gauche de Xcode.

Cliquez sur votre schéma dans le coin supérieur gauche de Xcode.

  • Sélectionnez "Modifier le schéma ..."

Sélectionnez "Modifier le schéma ..."

  • Cliquez sur le menu déroulant "Build Configuration". et changez-le en mode Debug.

Cliquez sur le menu déroulant "Build Configuration".

PersonneNada
la source
8
J'utilise le débogage. et que l'optimiseur est désactivé.
Mojtaba
C'était intéressant. Aussi parce que je l'avais réglé sur le mode Release , certains de mes points d'arrêt n'étaient pas touchés tandis que d'autres étaient touchés ¯_ (ツ) _ / ¯
Honey
60

Cet avertissement n'apparaît que lorsque vous atteignez un point d'arrêt et que la source se trouve dans un projet où l'optimisation est activée, vous empêchant de regarder les valeurs réelles des variables (chaque objet est affiché comme nul, même s'il ne l'est pas)

Dans mon cas, cela ne s'est produit que lors du débogage étape par étape via une dépendance cocoapod.

Ainsi, même si vos paramètres de cible et de projet principaux sont correctement définis (Strip Debug Symbol = OFF et Optimization level None), vous devez vous assurer qu'il en est de même pour le projet Pod à partir duquel vous atteignez le point d'arrêt.

entrez la description de l'image ici

Gomino
la source
Lisez d'autres réponses, ils suggèrent la même chose. mais ils sont tous éteints dans mon projet (aka None [-O0])
Mojtaba
2
Je sais que vous avez dit qu'il était désactivé dans votre projet, tout comme le mien, mais avez-vous jeté un œil à la configuration de vos projets de dépendances Pod?
Gomino
Même problème ici avec Xcode 7. Le problème est probablement apparu lorsque j'ai commencé à utiliser la bibliothèque trachkerbird. Mais le point d'arrêt se trouve dans mon propre code.
Mike
1
Pour le projet Pods, définissez le paramètre de niveau d'optimisation "PROJET" sur Aucun fonctionne. (aucun changement pour aucune cible de pod).
ooops
2
Ceci est une erreur. Il sera remplacé lorsque vous pod installrecommencerez. Changez-le comme ça .
Iulian Onofrei
13

Il s'avère qu'après l'importation d'un ancien projet (Xcode 7.x +) vers le nouveau Xcode 8.3 (8E162), probablement en raison de l'optimisation du compilateur, Swift Compiler - Optimization Level a été défini par défaut sur Fast, Single-File Optimization :

Avant

Le changer en aucun, a résolu le problème:

après

valvoline
la source
Je l'ai fait. Pas travaillé pour moi. Je suis confronté à ce problème dans la version ios générée par Unity.
Chandni
11

Editor-> Validate Settingspuis confirmez toutes les modifications. Ensuite, vous devriezNiveau d'optimisation du compilateur Swift en place

Définissez Debug sur None.

james sa
la source
1
Je l'ai fait. Pas travaillé pour moi. Je suis confronté à ce problème dans la version ios générée par Unity.
Chandni
9

C'était la solution pour moi ...

Dans le sens de la réponse de Gimino, si vous utilisez des cocoapodes, ajoutez une ligne comme celle-ci au Podfile:

xcodeproj 'MyProject', 'Debug - local'=>:debug, 'Debug - staging'=>:debug, 'Debug - PRODUCTION'=>:debug

ou pour les versions cocoapods> = 1.0 (merci Diejmon)

project 'MyProject', 'Debug - local'=>:debug, 'Debug - staging'=>:debug, 'Debug - PRODUCTION'=>:debug

Où MyProject a 'Debug - local', 'Debug - staging', 'Debug - PRODUCTION' comme configurations de débogage en plus du 'Debug' standard

Par défaut, les cocoapods génèrent généralement des configurations de pod en version Release, cette ligne Podfile vous permet de leur dire qu'ils sont en débogage.

wils
la source
9

J'ai rencontré le même problème aujourd'hui et je l'ai compris (au moins dans mon cas). J'utilise également CocoaPods, et j'avais ce problème lors de l'exécution de ma cible de test (Swift mélangé avec ObjC).

J'utilise Xcode 7.2, avec le SDK iOS 9.2.

Dans l'image ci-dessous, vous pouvez voir les optimisations pour la cible et le projet avant ma modification:

niveau d'optimisation avant changement

La chose surprenante est que même si l'optimisation résolue est Aucune [-O0] , seulement après avoir changé le paramètre du projet de -Os à -O0 que le compilateur a cessé d'optimiser la cible.

Ci-dessous, vous pouvez voir mes paramètres finaux:

niveau d'optimisation après changement

André Neves
la source
7

Cela fait longtemps, mais j'ai finalement résolu le problème. Il y a un troisième indicateur d'optimisation LTOou, Link Time Optimizationet étonnamment, personne ne l'a mentionné ici et pour une raison quelconque, je n'y ai pas fait attention non plus. C'est juste au-dessus duOptimization Level paramètre, comme vous pouvez le voir dans de nombreuses captures d'écran publiées ici.

Donc, pour résumer, il y a 3 indicateurs d'optimisation différents que vous souhaitez désactiver pour le débogage:

  • Optimisation du temps de liaison LLVM ( -flto)
  • Niveau d'optimisation LLVM ( -O)
  • Niveau d'optimisation du compilateur Swift

entrez la description de l'image ici

Plus d'informations sur LTO: http://llvm.org/docs/LinkTimeOptimization.html

Mojtaba
la source
2
Je l'ai fait. Pas travaillé pour moi. Je suis confronté à ce problème dans la version ios générée par Unity.
Chandni
@Chandni, Ici, j'ai rencontré le même problème, avez-vous trouvé la solution?
Ranjani
2

Si vous devez désactiver les optimisations pour vos modules Swift afin de pouvoir les déboguer, ajoutez ce qui suit à votre Podfile. Cela désactivera les optimisations pour les versions de débogage uniquement.

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      if config.name == "Debug"
        config.build_settings["SWIFT_OPTIMIZATION_LEVEL"] = "-Onone"
      end
    end
  end
end
Al Priest
la source
1

Êtes-vous sûr que votre configuration de débogage n'optimise pas le code (elle ne devrait pas)? Il semble que vous ayez accidentellement activé les optimisations pour la configuration de débogage et vous devez le désactiver à partir des paramètres de la cible.

Can Poyrazoğlu
la source
3
l'optimisation est désactivée pour tout. même publier la version juste pour être sûr
Mojtaba
@Mojtba Mais le mode Release active les optimisations!
NobodyNada
0

Cette erreur m'est arrivée deux fois, et dans tous les cas, c'était une erreur dans le paramètre URL utilisé pour demander un service. Dans un cas, l'URL avait de l'espace dans la section du port, dans l'autre cas, une valeur facultative n'était pas déballée.

Le correctif consistait donc à s'assurer que l'URL de la demande était bien formée. Plus d'informations sur mon cas, et des rapports similaires identiques ici .

le0diaz
la source
0

Tout ce que j'ai fait, c'est nettoyer ( Product > Clean) mon projet et le relancer

raed
la source
0

Cela peut être une simplification excessive, mais construisez-vous pour la version ou avec une optimisation (qui supprime les symboles de Swift ou LLVM) trop élevée? Si tel est le cas, modifiez votre schéma et passez à Debug, ou modifiez vos paramètres de génération pour l'optimisation rapide ou LLVM sur Aucun (0).

Aaron
la source
0

Juste au cas où quelqu'un serait confronté à ce problème lors du débogage d'un pod qui utilise une bibliothèque C en interne, il y a une autre chose que vous devez modifier dans les paramètres du projet pour le faire fonctionner en plus de tout le reste répertorié dans le thread.

Accédez aux paramètres du projet Pods -> Votre cible C-using -> Paramètres de construction -> Apple Clang - Indicateurs de compilateur personnalisés -> Autres -O3indicateurs C et supprimez l' indicateur qui y est arrivé d'une manière ou d'une autre.

Dmitry Serov
la source