Comment déboguer les extensions iOS 8 avec NSLog?

90
- (void)viewDidLoad
{
    NSLog(@"%s", __func__);
    // ...
}

dans viewDidLoadune extension iOS 8 . les NSLogsorties rien dans Xcode. NSLogfonctionne comme d'habitude dans l'application conteneur.

Comment puis-je obtenir la sortie des messages de débogage d'une extension?

ohho
la source
J'ai ce problème aussi. Peut-être que NSLog est juste cassé. J'utilise des points d'arrêt pour déboguer les valeurs pour le moment. Mais ils sont vraiment bogués aussi.
gallileo
J'ai un problème similaire où le débogueur ne se verrouille jamais et dit toujours "en attente d'attachement" dans Xcode. Malheureusement, je ne vois rien d'utile à googler et j'ai posté une question ici sur Stack sans encore de réponses.
Alex Bollbach du

Réponses:

95
  1. Le débogage fonctionne pour les extensions d'application.
  2. Cela fonctionne aussi sur simulateur.
  3. Si votre extension d'application plante dans le simulateur, vous constaterez peut-être qu'il n'est pas facile de redémarrer votre extension d'application. Le redémarrage de votre simulateur est une solution rapide.
  4. Étapes pour déboguer une extension d'application:

    1. Exécutez l'application conteneur. Au cours de cette étape, Xcode télécharge l'application conteneur et l'extension d'application sur l'appareil ou le simulateur.

    2. Arrêtez l'application conteneur. Cette étape est importante lorsque vous déboguez dans le simulateur. Si vous ne le faites pas, Xcode vous indiquera que le simulateur est en cours d'utilisation.

    3. Dans Xcode, appuyez sur le menu Debug -> Attach to Process -> By Process Identifer (PID) or Name ..., saisissez l'identifiant de l'application ext, par exemple com.abc.ContainerApp.MyExtension, pour démarrer le débogage. N'oubliez pas de définir des points d'arrêt. (Mise à jour du 25 août 2014: vous pouvez saisir MyExtension (le nom de votre extension) directement.)

    4. Dans l'appareil ou le simulateur, ouvrez votre extension d'application.


Mises à jour du 23 août 2014:

J'ai trouvé que les étapes de débogage ci-dessus ne fonctionnaient pas bien sur Xcode 6 beta 6 avec iOS 8 SDK beta 5 sur le simulateur.

Solution:

  1. Exécutez votre extension dans le simulateur.
  2. Menu Xcode Déboguer -> Joindre au processus -> Choisissez "MyExtension (le nom de votre extension)" dans la section Système du menu.

Les points d'arrêt fonctionnent. Mais je ne sais pas pourquoi les journaux ne s'affichent pas dans la fenêtre de sortie.

Vince Yuan
la source
8
Jusqu'à présent, le moyen le plus simple de déboguer (et voir NSLog) que j'ai trouvé est de suivre ces étapes: /// 1 /// Sélectionnez un schéma d'application de conteneur et exécutez-le. /// 2 /// Une fois qu'il est opérationnel - revenez à XCode et (sans même appuyer sur un bouton Stop) sélectionnez un schéma d'extension, puis appuyez sur le bouton Exécuter. /// 3 /// Lorsque vous êtes invité à choisir l'application à exécuter, sélectionnez Aujourd'hui. /// 4 /// Les points d'arrêt et NSLog devraient désormais fonctionner sans problème.
interrompre
1
Cela ne fonctionne pas encore aujourd'hui, surtout après un crash. C'est très ennuyeux, je ne comprends pas pourquoi est si difficile à réparer.
Cristi Băluță
3
J'ai essayé d'utiliser les instructions mises à jour ci-dessus et cela a fonctionné pour moi. Cependant, à l'étape 2, au lieu d'utiliser mon nom d'extension, j'ai utilisé "Par identificateur de processus (PID) ou nom ..." et entré le pid du processus. Cela m'a permis par magie d'utiliser mes points de rupture.
tony.tc.leung
Déboguer> Attacher au processus par PID ou nom: dans le champ de texte, entrez le nom du processus dans le navigateur de débogage, quelque chose comme com.company.AppName.AppName-ExtensionName
TigerCoding
Cette réponse n'est pas pertinente par rapport à la question. L'OP demande pourquoi les messages NSLog ne sont pas écrits sur la console dans une extension (une préoccupation légitime car je suis arrivé sur cette page avec la même question). Il ne mentionne rien sur les problèmes de connexion au débogueur.
Joey Carson du
49

J'ai ce problème aussi. Cela fonctionne pour moi si vous allez dans votre simulateur sous le menu Déboguer -> Ouvrir le journal système ...

De là, vous pouvez voir tous les journaux du simulateur iPhone (y compris les journaux de votre extension).

entrez la description de l'image ici

BalestraPatrick
la source
il ouvrira "~ / Library / Logs / CoreSimulator / <DEVICE_IDENTIFIER> /system.log" afin que vous puissiez facilement y trouver tous vos autres journaux de périphériques de simulation, remplacez simplement <DEVICE_IDENTIFIER> par l'ID de périphérique du simulateur
Hofi
32

NSLogfonctionne parfaitement .

Vous ne voyez tout simplement pas ce qui est enregistré dans la zone de débogage de Xcode car le débogueur Xcode n'est pas attaché à votre extension. Les extensions sont presque complètement indépendantes de leur application contenant. Ils ont des identifiants de bundle séparés, par exemple, et ce sont également des processus séparés sur le système d'exploitation.

J'ai eu des succès variés en obtenant Xcode pour attacher aux extensions. Apparemment, il semble qu'il s'attacherait automatiquement, et il apparaît dans le navigateur de débogage comme "En attente d'attachement", mais ne se joint jamais.

Parfois, je suis capable d'exécuter ma cible d'extension dans Xcode:

entrez la description de l'image ici

Et puis avoir la possibilité de choisir dans quelle application exécuter mon extension. Dans ce cas, je choisirais sa recommandation «aujourd'hui», qui est le centre de notification.

entrez la description de l'image ici

Et puis il attachait parfois le débogueur à mon extension. Notez que cette méthode ne fonctionne que sur les appareils physiques, semble-t-il.

S'il ne se joint pas, vous pouvez utiliser la méthode d'attachement manuel dans la réponse de @ VinceYaun,

J'ai également eu des succès variés en utilisant d'autres méthodes d'attachement. La plupart ont échoué, et il semble que ce ne sont que des bogues qui seront corrigés ultérieurement.

Pour afficher vos messages de journal, accédez à Window-> Devicesdans la barre supérieure et sélectionnez votre appareil. Vous pouvez afficher le journal de l'appareil à partir du bas de cette fenêtre. Si vous testez sur un simulateur, vous pouvez utiliser la réponse de @ BalestraPatrick .

Certains bogues ont été corrigés dans la bêta 2, et je suppose que le débogueur finira par s'attacher automatiquement lors du lancement de l'extension.

Mise à jour: dans les notes de publication d' iOS 8 Beta 4 :

Extensions

Corrigé dans la version bêta 4

  • Les extensions échouent parfois à se lancer lors du débogage à partir de Xcode.
  • Lorsque l'extension avec interface utilisateur est supprimée, elle est relancée et n'est pas rejetée.
  • Parfois, votre extension de partage ou d'action peut se bloquer.
  • Le redéploiement d'une extension peut la désactiver dans le centre de notifications.
père Noël
la source
avez-vous essayé la même approche pour les extensions de stockage?
SRP-Achiever
Cela n'a pas fonctionné pour moi dans Xcode 6 beta 2, mais la réponse de Vince Yuan a fonctionné. Malheureusement, dans Xcode 6 beta 3, le débogage des extensions ne fonctionne pas du tout pour moi. Je n'ai pas trouvé de solution à ce problème, nous devons probablement attendre la prochaine version.
Darrarski
@Darrarski Ma réponse est restée de la bêta 1. Pour info, la bêta 3 est sortie, vous devriez donc être sur ce point maintenant.
Père Noël
@SantaClaus assez clair. Mon commentaire était d'informer qu'aucune des solutions données ne fonctionne dans Xcode 6 beta 3 pour moi. Il semble que le débogage des extensions soit encore plus interrompu dans cette version. Espérons que la prochaine version bêta résoudra le problème.
Darrarski
3
Aucun de ces bugs ne m'a semblé corrigé dans la bêta 4 (maintenant la bêta 5).
mat
18

J'ai ce problème aussi. Xcode n'attache jamais mon débogueur à l'extension ni n'affiche les messages NSLog. Si vous attachez manuellement votre débogueur Xcode à votre processus d'extension, au moins les points d'arrêt fonctionnent comme un charme:

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
Masalis
la source
5
J'ai eu de la chance avec ça.
Santa Claus
2
upvote, mais ne fonctionne pas toujours, j'espère qu'Apple pourra attacher automatiquement le débogueur aux extensions dans les versions futures.
Jing
14
  1. Créer un schéma pour votre extension
  2. Exécuter le schéma
  3. Dans une boîte de dialogue, choisissez l'application conteneur
  4. Prendre plaisir

Cela fonctionne pour moi :)

Maciek Czarnik
la source
C'est exactement ce dont j'avais besoin
pob21
1
NSLogne fonctionnera que si vous exécutez l'application conteneur. Cela ne fonctionnera pas si vous exécutez l'extension d'application au lieu du conteneur.
JaredH
Cela a fonctionné pour moi aussi. Merci, Maciek Czarnik! Les solutions ci-dessus n'ont pas fonctionné pour moi. J'utilise Xcode 8.1.
plam4u
5

Xcode 8 est capable de déboguer les extensions:

  1. Choisissez le schéma d'extension dans la liste déroulante à côté du bouton d'arrêt et exécutez-le.
  2. Sélectionnez l'application parente dans la boîte de dialogue qui apparaît.

Résultat: les points d'arrêt et le journal fonctionnent comme d'habitude.

Jano
la source
2
Ne fonctionne pas dans mon cas d'une extension Today. obtention d'une erreur CLANG: ld: bibliothèque introuvable pour -lRPush clang: erreur: la commande de l'éditeur de liens a échoué avec le code de sortie 1 (utilisez -v pour voir l'invocation)
BadmintonCat
C'est une erreur sans rapport. Vous essayez de créer un lien vers une bibliothèque manquante. Ajoutez Liferay-Push à votre cible.
Jano
4

Ce qui m'a finalement permis de voir le journal dans la zone de débogage, sur la base de la suggestion de Michael et de la documentation d'Apple , est:

Créez et exécutez l'extension d'application dans le simulateur et, lorsque vous êtes invité à indiquer une application hôte, choisissez l'application spécifique à partir de laquelle vous allez appeler l'extension . Dans mon cas, je lançais mon extension Action à partir de Safari en tirant une feuille de partage sur un PDF.

Ce qui ne fonctionnait pas auparavant, c'était de suivre les suggestions d'autres personnes d'utiliser Today en tant qu'hôte, puis de quitter cette application et de passer à Safari pour appeler mon extension. Je n'ai même plus besoin d'exécuter mon application conteneur avant d'exécuter l'extension.

À partir de la documentation Apple:

Dans la phase d'exécution de votre schéma d'extension, vous spécifiez une application hôte comme exécutable. Lors de l'accès à l'extension via l'interface utilisateur de cet hôte spécifié, le débogueur Xcode se connecte à l'extension.

Andrew
la source
1

En fait, j'ai les journaux à exécuter tout simplement dans Xcode 6.3. Tout d'abord, créez et exécutez l'application contenant. Une fois que l'application conteneur est en cours d'exécution sur l'appareil, créez et exécutez l'extension d'application en modifiant le schéma en extension d'application.

Apple dispose d'une documentation directement liée au débogage, au profilage et au test de votre extension d'application.

Michael
la source
1

Une astuce qui fonctionne pour moi (même si elle est assez moche) est de placer un mannequin UILabelquelque part dans le coin inférieur de mon extension. Je l'appelle habituellement logLabel. Il est alors possible de mettre à jour le texte de cette étiquette avec n'importe quelle instruction de journal que vous souhaitez enregistrer. Une telle approche n'est pas très bonne si vous avez besoin de consigner des instructions à partir d'instances de différentes classes. Et, évidemment, cela encombre votre interface utilisateur.

Cependant, si vous avez un widget assez simple et que le léger encombrement de l'interface utilisateur ne vous dérange pas, cela fera l'affaire. J'ai essayé toutes les autres solutions décrites dans cette discussion et, malheureusement, aucune d'elles n'a fonctionné pour moi.

Andriy Gordiychuk
la source
1

La seule façon dont le débogage fonctionne pour moi est de sélectionner Debug-> Attach To Process By PID ou Name Puis entrez le PID et non le nom de l'extension. Vous pouvez trouver le PID en exécutant l'extension sur un appareil, allez dans Fenêtre-> Appareils. Trouvez votre appareil et affichez la console. Lorsque vous voyez le nom de votre poste, il est suivi de 5 chiffres. C'est le PID

J'ai également mis un tas de NSLog dans l'extension afin de trouver également le PID. C'est sur xCode 7

Tony
la source
1

Rencontrez le même problème concernant l'extension pour NSLoget les points d'arrêt. Je l'ai combattu pendant plusieurs jours.

Device logpeut être trouvé comme image suivante. C'est à XCode -> Window -> Devices and Simulators.

Après avoir entré le Open Console, il y a un champ de recherche en haut à droite de la boîte de dialogue. Je peux appliquer la règle de filtrage là-dedans. Par exemple, un nom de processus contient Notificationun mot clé ou le nom de processus doit être égal au nom de la cible d'extension, ex: égal au MyNotificationServiceExtensionnom du processus.

Journal de l'appareil

AechoLiu
la source
0

Il est clair que quelque chose est cassé dans Xcode6-B5.

Si j'essaie d'exécuter une extension de photo sur le simulateur, je ne peux voir aucun Photos.app comme option pour le processus d'attachement d'extension.

options de débogage dans le simulateur

Le même, fonctionnant sur un vrai appareil, me donne le bon comportement.

options de débogage avec un appareil réel

Dans le premier cas, aucun point d'arrêt n'est respecté. Dans ce dernier cas, les points d'arrêt fonctionnent comme un charme.

valvoline
la source
0

Vous devez savoir que l'application conteneur et l'extension sont totalement deux processus de différence dans iOS tandis que LLVM ne débogue qu'un thread à la fois, donc lorsque vous déboguez, la console ne consigne jamais l'extension et ne s'arrête jamais au point d'arrêt.

Vous pouvez résoudre la plupart des problèmes avec la méthode de @Vince Yuan.

Cependant, mon problème est que le débogueur Xcode ne s'accroche guère à mon extension de clavier à la fois sur le simulateur iOS et sur les appareils, comme 1 fois sur 7-8, c'est totalement une question de probabilité. La méthode de @Vince Yuan ne fonctionne que parfois.

Ma petite expérience est que lorsque vous exécutez votre schéma de débogage, si la session de débogage dans le panneau de gauche montre que `` Aucune session de débogage '', il n'est pas nécessaire d'ouvrir votre extension et de la tester, le débogueur ne s'est pas connecté, exécutez simplement encore une fois pour la chance.

mais quand vous voyez que com.xxx.xxx.xxx attend Attacher, l'extension peut certainement être déboguée.

C'est une petite astuce pour qui ne peut pas déboguer l'extension iOS, en particulier l'extension du clavier.

Henri
la source
0

Depuis Xcode 6 Beta 5, j'ai pu utiliser un appareil réel exécutant iOS8 pour déboguer mon extension. Essayez de l'exécuter sur un appareil et sélectionnez Safari pour lancer

Rich86man
la source
0

Pour surmonter tous les états causés par l'EDI en constante évolution, j'utilise la console iOS de lemonjar.com - il affiche une fenêtre de console pour tout appareil iOS connecté rendant des messages syslog quel que soit l'ID de processus. Vous pouvez voir les messages du journal de débogage des applications et des extensions à la fois ici.

igraczech
la source
0

Je pourrais déboguer mon extension de la manière que je décris ci-dessous:

  1. Xcode : Debug-> Attach to process by PID or Name. Le nom de votre schéma d'extension.
  2. Ensuite, sélectionnez votre main app targetet exécutez.

J'espère que cela fonctionne aussi pour vous les gars.

abdullahselek
la source