web-dev-qa-db-fra.com

Impossible de déboguer le module/framework Swift intégré à l'application Objective-C

Titres alternatifs (pour faciliter la recherche)

  • Impossible de déboguer le framework Swift 2.3 lié à une application Objective-C dans Xcode 8
  • error in auto-import: failed to get module 'XYZ' from AST context Xcode 8
  • Xcode 8 ne peut pas déboguer le framework Swift
  • warning: Swift error in module <XYZ>
  • Solution de contournement pour; Xcode Debugger ne peut pas déboguer des applications écrites en Objective-C uniquement, mais ce lien avec des frameworks écrits en Swift uniquement. (28312362)

J'ai une application écrite en Objective-C qui relie certains modules (frameworks) écrits en Swift 2.x.

Question

Tout (débogage, etc.) fonctionne bien dans xcode7 , cependant lors du passage à xcode8 et de la mise à jour des modules pour utiliser Swift2.3 je ne pouvais pas déboguer les modules.

LLDB a signalé ces erreurs: 

warning: Swift error in module XYZ.
Debug info from this module will be unavailable in the debugger.

error: in auto-import:
failed to get module 'ABC' from AST context

Cela ne se produit pas si je lie les modules à une application intégrée à Swift 2.3.

26
rjstelling

tl: dr

Ajoutez un paramètre défini par l'utilisateur sous "Paramètres de construction" pour la cible de votre application.

Swift_VERSION = 2.3

 Swift_VERSION = 2.3 — Build Settings

Plus d'informations

Je ne sais pas s'il s'agit d'un bogue Xcode 8 ou s'il s'agit d'une politique Apple (pour forcer les développeurs à forcer Swift 3.0?). Mais ... par défaut, Xcode 8 installe les versions Swift 3.0 des bibliothèques d’exécution standard de Swift. 

En ce qui concerne le débogage avec LLDM, les modules de Swift 2.3 ne se chargent pas (dans le runtime de Swift 3.0). 

Forcer l'application à utiliser Swift 2.3 (ou Swift hérité comme Apple l'appelle) résout le problème.

Les applications Swift ont ce paramètre exposé par Xcode mais vous devez l'ajouter manuellement pour une application Objective-C.

Conseil supplémentaire

Portez votre code Swift 2.3 vers Swift 3.0 dès que possible, Apple ne supportera pas la version 2.x très longtemps. 

6
rjstelling

Pour moi, c'était aussi simple que douloureux et fastidieux: 

import SDWebImage était le problème , .__, car l'un des cadres contenait déjà SDWebImage (et je ne pouvais pas le voir), et ce cadre se trouvait être Objective-C et l'application Swift. J'ai aussi ajouté SDWebImage au projet, parce que je l'utilise dans les classes que j'écris, et que ce qui a créé le désordre que le débogueur xCode n'a pas pu traiter. Donc, en gros, assurez-vous de ne rien dupliquer de quelque manière que ce soit, je vérifie les éléments courants tels que SDWebImage, par exemple.

17
Tim Friedland

utilisez fr v à la place de po pour le débogage 

Pour plus de débogage https://www.codeproject.com/Articles/1181358/Debugging-with-Xcode

10
Suresh Kansujiya

J'ai discuté de cette question avec un ingénieur Apple, Sean, au WWDC 2017.

Mon équipe a passé des semaines à essayer de résoudre ce problème, et il s’est avéré qu’il s’agissait d’un bogue sur le compilateur d’Apple, ce que nous n’aurions jamais pu résoudre nous-mêmes. En outre, il existe une solution de contournement TRÈS facile.

Il se peut qu'il y ait un problème avec la façon dont les indicateurs de compilation sont agrégés à partir des frameworks et du projet, et que le projet "pur Objective-C" le "active".

Solution: ajoutez un seul fichier Swift vide ("Whatever.Swift" ou autre) dans votre projet Objective-C, en le rendant non-pur-objectif-c (nouveau-> fichier-> fichier Swift, ne créez pas l'en-tête de pontage. Le fichier ne contiendra que l'importation de Foundation).

Et c'est tout. Problème résolu.

9
fredericouimet

J'ai rencontré le message error in auto-import: failed to get module 'XYZ' from AST context lors d'une tentative de débogage dans un simulateur 9.3. Le passage à un simulateur 10.2 a résolu le problème.

2
Jason Moore

Je me suis heurté à cela lors de la construction d'un cadre avec Carthage. Essayer de déboguer imprimera l'erreur, qui faisait référence à une dépendance du framework Obj-C.

J'ai trouvé ce blog post qui proposait d'ajouter à mon projet le paramètre de construction défini par l'utilisateur suivant:

Pour le débogage: REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = NO

Pour la version: REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = YES

Cela a résolu le problème pour moi.

2
Austin

Dans mon cas, j'ai dû supprimer Objective-C Bridging header du fichier de paramètres de construction. Mon fichier d'en-tête Bridging n'a rien fait .. alors tout s'est bien passé.

2
Chamira Fernando

Essayez de redémarrer Xcode. Dans mon cas, cela a résolu un problème.

1
saltwat5r

Comme suggéré par Tim https://stackoverflow.com/a/41876400/1840269 la cause première de notre problème était une question de doublons.

Nous avions une catégorie wrapper obj-c pour SDWebImage qui était utilisée à la fois par obj-c et Swift . Lorsque vous importez la catégorie depuis Swift, tout a été détruit à cause de l'importation de redéfinition/duplication, car le pod SDWebImage l'exposait déjà sous forme de Swift module.

La solution? Nous avons réimplémenté la catégorie obj-c en tant qu'extension Swift - et avons continué à l'utiliser depuis Swift et obj-c en ajoutant @objc devant l'extension et en important le fichier #import "product-Swift.h" depuis obj-c.

Et peut-être commencer par vérifier: https://developer.Apple.com/library/content/qa/qa1947/_index.html .

0
micmdk

Je viens de prendre 2 jours pour résoudre et déboguer par l’intermédiaire de la commande print tout le temps. Maintenant, j'ai le problème:

Mon projet est dans Swift et j'utilisais la bibliothèque objective-C identique à celle importée dans les pods pour Swift (l'ancien projet Objective-C fusionné dans celui-ci) et utilisais l'importation IQKeyboardManager ainsi que l'importation de l'en-tête "IQKeyboardManager.h". Cela est en conflit et en supprimant l’en-tête, on a finalement résolu mon problème .. Vous pouvez vérifier avec ce type de duplicité dans les bibliothèques.

0
Taranjeet Kaur

Dans mon cas, il y avait une erreur de compilation dans le code "C" qui a été rapportée dans LLDB, après avoir corrigé l'erreur, LLDB a recommencé à fonctionner.

0
mbonness