iOS 10 n'imprime pas les NSLogs


88

Rien ne s'imprime à partir NSLogde Xcode 8.0 beta (8S128d). printfest inchangé

Voici mon code:

NSLog(@"hello from NSLog");
printf("hello from printf");

Voici la sortie sur le simulateur iOS 9:

2016-06-17 09:49:10.887 calmapp-dev[28517:567025] hello from NSLog
hello from printf

Voici la sortie sur iOS 10 Simulator:

hello from printf

J'ai eu un problème similaire. Mais dans iOS 8.1, Xcode 8. J'ai vérifié chaque réponse ici. Il s'avère que je faisais tout correctement. Rien n'a vraiment aidé. Alors, j'ai éteint l'appareil et l'ai allumé. Ça marche. J'ai écrit ce commentaire ici afin qu'il puisse aider d'autres personnes confrontées à un problème similaire
KrishnaCA

Réponses:


229

Il se peut que vous ayez ajouté la propriété "OS_ACTIVITY_MODE": "disable" dans les variables d'environnement Scheme (pour masquer la sortie du système d'exploitation du simulateur) et que vous l'ayez oublié, et que vous l'utilisez maintenant sur un appareil réel.

Dans Xcode 8:

Product -> Scheme -> Edit Scheme -> Run -> Arguments -> Environment Variables

Ajoutez OS_ACTIVITY_MODEet vérifiez seulement (N'ajoutez pas de valeur)

entrez la description de l'image ici

entrez la description de l'image ici

Résumé: Il s'agit d'un bogue de Xcode 8 + iOS10, nous pouvons le résoudre de cette manière:

  • Lors de l'utilisation du simulateur, ajoutez le nom "OS_ACTIVITY_MODE" et la valeur "disable" et vérifiez-le.

  • Sur un appareil réel, ajoutez uniquement "OS_ACTIVITY_MODE" et cochez-le (N'ajoutez pas la valeur). Vous verrez le NSLog dans la console Xcode8.


4
> "N'ajoutez pas la valeur" Je l'ai mis sur "désactiver" et ça marche! Le champ vide ne fonctionne pas pour moi.
m8labs

Êtes-vous sûr que cela fonctionne lors du débogage d'un appareil iPhone réel, pas du simulateur? Si je le mets sur "désactiver", la console ne peut pas NSLog lors du débogage réel de l'iphone.
user6833743

J'ai vérifié maintenant sans "désactiver", cela fonctionne sur l'appareil maintenant, mais cassé sur le simulateur, il montre tout à nouveau maintenant ...
m8labs

2
existe-t-il de toute façon pour automatiser ce processus? c'est vraiment vraiment ennuyeux que nous devons nous rappeler de faire des allers-retours comme ceci: /
serre

2
Cette solution masquera tous les NSLog commençant par Xcode 9. Pour conserver NSLog, remplacez-les disablepar default.
Cœur du

27

Si vous consultez les notes de version bêta de Xcode 8 , vous constaterez qu'il est dit:

Lors du débogage d'une application exécutée sur Simulator, les journaux peuvent ne pas être visibles dans la console. Solution de contournement: utilisez la commande + / dans Simulator.app pour ouvrir le journal système dans l'application Console pour afficher les NSLogs. (26457535)


9
Je ne peux pas non plus voir la sortie NSLog dans le vrai appareil iOS 10. Si vous utilisez de vrais appareils, vous pouvez ouvrir la fenêtre Appareils (Maj + Commande + 2) et y voir les journaux de l'appareil, mais il est difficile de regarder le débogage du journal des applications car la console affiche tous les journaux du système et des applications.
kientux

19

le NSlog ou l'impression est réellement exécuté mais est caché parmi de nombreuses autres sorties de débogage de la console pour résoudre ce problème Ouvrez Xcode8:

Product -> Scheme -> Edit Scheme -> Run -> Arguments -> Environment Variables

ajoutez "OS_ACTIVITY_MODE" et définissez la valeur sur "désactiver" et vérifiez-la.

cliquez sur fermer

xcode9

ajoutez "OS_ACTIVITY_MODE" et définissez la valeur sur "default" et vérifiez-la.

entrez la description de l'image ici entrez la description de l'image ici


Cela ne fonctionne pas pour moi. Les NSLogs n'apparaissent pas pour les applications déployées. J'utilise xcode 8.1 (sous Mac 10.11) avec un appareil iOS 10.
mobjug

21
Cette solution masquera tous les NSLog commençant par Xcode 9. Pour conserver NSLog, remplacez-les disablepar default.
Cœur du

3
Cette réponse doit être mise à jour pour tenir compte de la correction de @ Cœur pour Xcode 9.
Joel

7

Je ne peux pas non plus voir la sortie NSLog dans le vrai appareil iOS 10. Si vous utilisez de vrais appareils, vous pouvez ouvrir la fenêtre Appareils à partir de Xcode (Maj + Commande + 2) et y voir les journaux de l'appareil, mais il est difficile de consulter les journaux de votre application car la console affiche les journaux du système et de toutes les applications.

(J'utilise Xcode 7, donc ce n'est peut-être pas le problème de Xcode mais le problème d'iOS 10)


Je ne vois pas les NSLogs de mon application dans la fenêtre des appareils sous iOS 10 GM ... rencontrez-vous le même problème?
TahoeWolverine

Je peux voir les journaux dans Xcode 7 avec iOS 10 GM, plus besoin d'ouvrir la fenêtre des appareils.
kientux le

2
Je ne parle pas d'exécuter à partir de Xcode, cependant, je parle des journaux imprimés à partir d'une application déployée.
TahoeWolverine

Des progrès à ce sujet?
jhurray

Les NSLogs et printf sont omis du journal des appareils iOS 10 dans les applications déployées. Vous pouvez ajouter une macro globale pour la remplacer par un appel directement à os_log.
Elist

7

Assurez-vous également que la console est réellement visible dans Xcode (par exemple, assurez-vous que l'icône de droite est surlignée en bleu, comme sur l'image ci-dessous). Après avoir mis à niveau Xcode, il cache la console et ne m'a montré que la vue Variables. Cela donnait l'impression que cela NSLog()ne fonctionnait pas correctement, alors que cela fonctionnait correctement, je ne pouvais tout simplement pas voir la sortie.

entrez la description de l'image ici


Peut également activer la console avec la Shift + ⌘ + Cversion 8.3.3 de Xcode
DJ2

5

Hmmm ... il semble que la propriété "OS_ACTIVITY_MODE": "disable" Empêche NSlog de s'afficher dans le journal Xcode 9.

Décocher cette valeur dans mon schéma a restauré mes journaux.


5

Pour quiconque découvre cela à l'avenir. La raison pour laquelle NSLog n'imprime pas dans syslog dans iOS 10 et iOS 11 est due au passage d'Apple à la journalisation unifiée.

Vous pouvez voir la WWDC en parler ici: https://developer.apple.com/videos/play/wwdc2016/721/

Documentation ici: https://developer.apple.com/documentation/os/logging

À partir de 10, vous devriez utiliser os_log au lieu de NSLog.

Comment trouver les journaux sur le disque: https://www.blackbagtech.com/blog/2017/09/22/accessing-unified-logs-image/

Pour résumer, les journaux sont situés dans /var/db/diagnosticslesquels peuvent être trouvés pour une machine virtuelle à/Users/USERNAME/Library/Developer/CoreSimulator/Devices/SIMULATOR-GUID/data/var/db/

Copiez tous les éléments à l'intérieur diagnosticset uuidtextdans un seul dossier (n'incluez pas les dossiers diagnostics ou uuidtext juste ce qu'il y a à l'intérieur).

Renommez ce dossier foldername.xarchive.

Ouvrez-le dans Console.app ou utilisez l'utilitaire OSX log:log show <path to archive> --info --predicate <options>


Et sur iOS?
kakyo

1

J'utilise Xcode 8, donc j'ai également rencontré le même problème. Et j'ai résolu ce problème en ajoutant value = disablele simulateur, mais sur une vraie machine, je n'ajoute pas de valeur.


1
J'ai quelques problèmes avec Xcode 9. J'ai inséré l'argument: OS_ACTIVITY_MODE mais il semble ne pas fonctionner ...
Alessio Campanelli

4
Cette solution masquera tous les NSLog commençant par Xcode 9. Pour conserver NSLog, remplacez-les disablepar default.
Cœur du

À mon avis, c'est la bonne réponse. OS_ACTIVITY_MODEavec disableou defaultest direct
Greg

1

NSLogles messages ne s'affichent plus lorsque je suis passé à Xcode 9.1 + iOS 11.1. Au départ, la réponse acceptée m'a donné un moyen de contourner ce problème en utilisant l'application Console et en activant le simulateur ( voir la réponse de Lucas ).

Dans l'application Console sous Actionj'ai essayé de sélectionner Include Debug Messageset de désélectionner Include Info Messages(pour que la console ne soit pas submergée de messages système). NSLogdes messages sont apparus dans la fenêtre de la console dans Xcode mais pas dans l'application de la console.

J'ai réalisé qu'il devait y avoir un moyen plus direct pour disableou permettre (c'est-à-dire default) NSLogsgrâce au commentaire de Coeur en réponse à cette réponse. À mon avis , il est la meilleure réponse , car la mise OS_ACTIVITY_MODEà disableou defaultaura plus de sens pour les débutants.

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.