iOS 10 nie drukuje NSLogs

89

Nic nie jest drukowane NSLogw Xcode 8.0 beta (8S128d). printfjest niezmieniony

Oto mój kod:

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

Oto dane wyjściowe w symulatorze iOS 9:

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

Oto dane wyjściowe w symulatorze iOS 10:

hello from printf
Tyler Sheaffer
źródło
Miałem podobny problem. Ale w iOS 8.1, Xcode 8. Sprawdziłem tutaj każdą odpowiedź. Okazuje się, że wszystko robiłem poprawnie. Nic tak naprawdę nie pomogło. Wyłączyłem więc urządzenie i włączyłem. To działa. Napisałem ten komentarz tutaj, aby mógł pomóc innym borykającym się z podobnym problemem
KrishnaCA

Odpowiedzi:

229

Możliwe, że dodałeś właściwość „OS_ACTIVITY_MODE”: „disable” do zmiennych środowiskowych Scheme (aby ukryć dane wyjściowe systemu operacyjnego z symulatora) i zapomniałeś o tym, a teraz działają na prawdziwym urządzeniu.

W Xcode 8:

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

Tylko dodaj OS_ACTIVITY_MODEi zaznacz (Nie dodawaj wartości)

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

Podsumowanie: To jest błąd Xcode 8 + iOS10, możemy go rozwiązać w ten sposób:

  • Używając symulatora, dodaj Nazwę „OS_ACTIVITY_MODE” i Wartość „wyłącz” i zaznacz ją.

  • Na prawdziwym urządzeniu dodaj tylko „OS_ACTIVITY_MODE” i zaznacz to (Nie dodawaj wartości). Zobaczysz NSLog w konsoli Xcode8.

user6833743
źródło
4
> „Nie dodawaj wartości” Ustawiam ją na „wyłącz” i działa! Puste pole nie działa dla mnie.
m8labs
Czy na pewno to działa podczas debugowania prawdziwego urządzenia iPhone, a nie symulatora? Jeśli ustawię to na „wyłączenie”, konsola nie będzie mogła NSLog podczas prawdziwego debugowania iPhone'a.
user6833743
Sprawdziłem teraz bez "wyłącz", teraz działa na urządzeniu, ale zepsuty na symulatorze, teraz pokazuje wszystko ponownie ...
m8labs
2
czy istnieje sposób na zautomatyzowanie tego procesu? to naprawdę bardzo irytujące, że musimy pamiętać, aby poruszać się tam iz powrotem w ten sposób: /
szklarnia
2
Rozwiązanie to ukryje wszystkie NSLog wychodząc z Xcode 9. Aby utrzymać NSLog, wymienić disablez default.
Cœur
27

Jeśli sprawdzisz informacje o wersji beta Xcode 8 , przekonasz się, że jest na nich napisane:

Podczas debugowania aplikacji działającej w symulatorze dzienniki mogą nie być widoczne w konsoli. Obejście: użyj polecenia + / w Simulator.app, aby otworzyć dziennik systemowy w aplikacji konsoli, aby wyświetlić dzienniki NSLog. (26457535)

Lucas
źródło
9
Nie widzę też wyjścia NSLog na prawdziwym urządzeniu z iOS 10. Jeśli używasz prawdziwych urządzeń, możesz otworzyć okno Urządzenia (Shift + Command + 2) i zobaczyć tam dzienniki urządzeń, ale trudno jest spojrzeć na dziennik aplikacji debugowania, ponieważ konsola pokazuje wszystkie dzienniki z systemu i aplikacji.
kientux
19

NSlog lub print jest faktycznie wykonywany, ale jest ukryty wśród wielu innych wyników debugowania konsoli w celu rozwiązania tego problemu Otwórz Xcode8:

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

dodaj „OS_ACTIVITY_MODE” i ustaw wartość na „wyłącz” i sprawdź to.

kliknij zamknij

xcode9

dodaj „OS_ACTIVITY_MODE” i ustaw wartość na „domyślną” i sprawdź ją.

wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj

MiladiuM
źródło
To nie działa dla mnie. Dzienniki NSLog nie są wyświetlane dla wdrożonych aplikacji. Używam Xcode 8.1 (działającego na Macu 10.11) z urządzeniem iOS 10.
mobjug
22
Rozwiązanie to ukryje wszystkie NSLog wychodząc z Xcode 9. Aby utrzymać NSLog, wymienić disablez default.
Cœur
3
Ta odpowiedź powinna zostać zaktualizowana, aby uwzględnić poprawkę @ Cœur dla Xcode 9.
Joel
8

Upewnij się również, że konsola jest rzeczywiście widoczna w Xcode (tj. Upewnij się, że ikona po prawej stronie jest podświetlona na niebiesko, jak na poniższym obrazku). Po uaktualnieniu Xcode ukrył konsolę i pokazał mi tylko widok Zmienne. To sprawiło, że wyglądało na to, że NSLog()nie działa poprawnie, podczas gdy rzeczywiście działał poprawnie, po prostu nie mogłem zobaczyć wyjścia.

wprowadź opis obrazu tutaj

Stewart Macdonald
źródło
Można również aktywować konsolę z Shift + ⌘ + CXcode w wersji 8.3.3
DJ2
co za wspaniały projekt interfejsu użytkownika @ Apple, pełen ikon o nieznanym znaczeniu
Ornithopter
7

Nie widzę też wyjścia NSLog na prawdziwym urządzeniu z iOS 10. Jeśli używasz prawdziwych urządzeń, możesz otworzyć okno Urządzenia z Xcode (Shift + Command + 2) i zobaczyć tam dzienniki urządzeń, ale trudno jest spojrzeć na dzienniki aplikacji, ponieważ konsola wyświetla dzienniki z systemu i wszystkich aplikacji.

(Używam Xcode 7, więc może to nie problem Xcode, ale problem z iOS 10)

kientux
źródło
Nie widzę dzienników NSLog dla mojej aplikacji w oknie urządzeń w systemie iOS 10 GM ... czy masz ten sam problem?
TahoeWolverine
Widzę logi w Xcode 7 z iOS 10 GM, nie muszę już otwierać okna urządzeń.
kientux
2
Nie mówię jednak o uruchamianiu z Xcode, mówię o drukowaniu dzienników z wdrożonej aplikacji.
TahoeWolverine
Jakieś postępy w tej sprawie?
jhurray
Dzienniki NSLog i printf są pomijane w dziennikach urządzeń z systemem iOS 10 we wdrożonych aplikacjach. Możesz dodać makro globalne, aby zastąpić je bezpośrednim wywołaniem os_log.
Elist
6

Hmmm ... wygląda na to, że właściwość "OS_ACTIVITY_MODE": "wyłącz" ZABEZPIECZA NSlog przed pojawieniem się w dzienniku Xcode 9.

Odznaczenie tej wartości w moim schemacie przywróciło moje dzienniki.

David Hersey
źródło
6

Dla każdego, kto spotka się z tym w przyszłości. Powodem, dla którego NSLog nie drukuje do syslog w iOS 10 i iOS 11, jest zmiana Apple na Unified Logging.

Możesz zobaczyć, jak WWDC o tym mówi tutaj: https://developer.apple.com/videos/play/wwdc2016/721/

Dokumentacja tutaj: https://developer.apple.com/documentation/os/logging

Od 10 roku powinieneś używać os_log zamiast NSLog.

Jak znaleźć logi na dysku: https://www.blackbagtech.com/blog/2017/09/22/accessing-unified-logs-image/

Podsumowując, znajdują się dzienniki, w /var/db/diagnosticsktórych można znaleźć maszynę wirtualną pod adresem/Users/USERNAME/Library/Developer/CoreSimulator/Devices/SIMULATOR-GUID/data/var/db/

Skopiuj wszystkie elementy wewnątrz diagnosticsi uuidtextdo jednego folderu (nie dołączaj diagnostyki folderów ani uuidtext, tylko tego, co jest w środku).

Zmień nazwę tego folderu foldername.xarchive.

Otwórz go w Console.app lub użyj narzędzia OSX log:log show <path to archive> --info --predicate <options>

shane
źródło
A co z iOS?
kakyo
1

Używam Xcode 8, więc napotkałem ten sam problem. I rozwiązałem ten problem dodając value = disablesymulator, ale na prawdziwej maszynie nie dodam wartości.

user6733740
źródło
1
Mam pewne problemy z Xcode 9. Wstawiłem argument: OS_ACTIVITY_MODE, ale wygląda na to, że nie działa ...
Alessio Campanelli
4
Rozwiązanie to ukryje wszystkie NSLog wychodząc z Xcode 9. Aby utrzymać NSLog, wymienić disablez default.
Cœur
Moim zdaniem to jest poprawna odpowiedź. OS_ACTIVITY_MODEz disablelub defaultjest bezpośredni
Greg
1

NSLogkomunikaty nie są już wyświetlane po uaktualnieniu do Xcode 9.1 + iOS 11.1. Początkowo zaakceptowana odpowiedź dała mi sposób na obejście tego za pomocą aplikacji Console i włączenie Symulatora ( patrz odpowiedź Lucasa ).

W aplikacji Konsola Actionpróbowałem wybierać Include Debug Messagesi odznaczać Include Info Messages(aby Konsola nie była zasypana komunikatami systemowymi). NSLogkomunikaty pojawiały się w oknie konsoli w Xcode, ale nie w aplikacji Console.

Zdałem sobie sprawę, że musi istnieć bardziej bezpośrednia droga disablelub umożliwienie (tj. default) NSLogsDzięki komentarzowi Coeura w odpowiedzi na tę odpowiedź. Moim zdaniem to najlepsza odpowiedź, ponieważ ustawienie OS_ACTIVITY_MODEna disablelub defaultbędzie miało większy sens dla początkujących.

Greg
źródło