iOS 10 не печатает NSLogs


89

Ничего не печатается из NSLogбета-версии Xcode 8.0 (8S128d). printfбез изменений

Вот мой код:

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

Вот результат работы симулятора iOS 9:

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

Вот результат работы симулятора iOS 10:

hello from printf

У меня была аналогичная проблема. Но в iOS 8.1 Xcode 8. Я проверил каждый ответ здесь. Оказывается, я все делал правильно. Ничего особо не помогло. Итак, я выключил устройство и включил его. Оно работает. Я написал этот комментарий здесь, чтобы он мог помочь другим, столкнувшимся с подобной проблемой
KrishnaCA

Ответы:


229

Возможно, вы добавили свойство «OS_ACTIVITY_MODE»: «disable» в переменные среды Scheme (чтобы скрыть вывод ОС из симулятора) и забыли об этом, и теперь работаете на реальном устройстве.

В Xcode 8:

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

Только добавляйте OS_ACTIVITY_MODEи проверяйте (не добавляйте значения)

введите описание изображения здесь

введите описание изображения здесь

Резюме: это ошибка Xcode 8 + iOS10, мы можем решить ее следующим образом:

  • При использовании симулятора добавьте имя «OS_ACTIVITY_MODE» и значение «отключить» и проверьте его.

  • На реальном устройстве добавьте только «OS_ACTIVITY_MODE» и отметьте его (не добавляйте значение). Вы увидите NSLog в консоли Xcode8.


4
> «Не добавлять значение», я установил его на «отключить», и он работает! Пустое поле у ​​меня не работает.
m8labs

Вы уверены, что он работает при отладке реального устройства iphone, а не симулятора? Если я установлю его на «отключить», консоль не сможет NSLog при реальной отладке iphone.
user6833743

Я проверил сейчас без "отключения", теперь он работает на устройстве, но сломан на симуляторе, он снова все показывает ...
m8labs

2
есть ли способ автоматизировать этот процесс? это действительно очень раздражает, что мы должны помнить, что нужно двигаться вперед и назад вот так: /
теплица

2
Это решение скроет весь NSLog, начиная с Xcode 9. Чтобы сохранить NSLog, замените его disableна default.
Cœur

27

Если вы посмотрите примечания к выпуску бета-версии Xcode 8 , вы обнаружите, что там говорится:

При отладке приложения, запущенного на симуляторе, журналы могут не отображаться в консоли. Обходной путь: используйте команду + / в Simulator.app, чтобы открыть системный журнал в приложении Console для просмотра NSLogs. (26457535)


9
Я также не вижу вывода NSLog на реальном устройстве iOS 10. Если вы используете реальные устройства, вы можете открыть окно «Устройства» (Shift + Command + 2) и просмотреть там журналы устройств, но при этом трудно просматривать журнал отладки приложений, потому что консоль показывает все журналы из системы и приложений.
kientux

19

NSlog или print фактически выполняются, но скрыты среди множества других выводов отладки консоли, чтобы решить эту проблему. Откройте Xcode8:

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

добавьте «OS_ACTIVITY_MODE», установите значение «отключить» и проверьте его.

нажмите закрыть

xcode9

добавьте "OS_ACTIVITY_MODE", установите значение "default" и проверьте его.

введите описание изображения здесь введите описание изображения здесь


У меня это не работает. NSLogs не отображаются для развернутых приложений. Я использую xcode 8.1 (работает на Mac 10.11) с устройством iOS 10.
mobjug

22
Это решение скроет весь NSLog, начиная с Xcode 9. Чтобы сохранить NSLog, замените его disableна default.
Cœur

3
Этот ответ должен быть обновлен с учетом поправки @Cœur для Xcode 9.
Джоэл,

8

Кроме того, убедитесь, что консоль действительно видна в Xcode (т.е. убедитесь, что значок с правой стороны выделен синим цветом, как показано на изображении ниже). После того, как я обновил Xcode, он скрыл консоль и показал мне только представление переменных. Это выглядело так, как будто NSLog()не работает должным образом, тогда как это действительно работало правильно, я просто не мог видеть результат.

введите описание изображения здесь


Также можно активировать консоль с Shift + ⌘ + CXcode версии 8.3.3
DJ2

Какой отличный дизайн пользовательского интерфейса @Apple, полный непонятных значков
Ornithopter

7

Я тоже не вижу вывода NSLog на реальном устройстве iOS 10. Если вы используете реальные устройства, вы можете открыть окно «Устройства» из Xcode (Shift + Command + 2) и увидеть там журналы устройств, но просматривать журналы вашего приложения сложно, потому что консоль показывает журналы из системы и всех приложений.

(Я использую Xcode 7, поэтому это может не проблема Xcode, а проблема iOS 10)


Я не вижу NSLogs для своего приложения в окне устройств под iOS 10 GM ... у вас такая же проблема?
TahoeWolverine

Я могу видеть журналы в Xcode 7 с iOS 10 GM, больше не нужно открывать окно устройств.
kientux

2
Я не говорю о запуске из Xcode, я говорю о журналах, которые печатаются из развернутого приложения.
TahoeWolverine

Есть ли в этом прогресс?
jhurray

NSLogs и printf не включаются в журнал устройств iOS 10 в развернутых приложениях. Вы можете добавить глобальный макрос, чтобы заменить его прямым вызовом os_log.
Elist

6

Хммм ... похоже, что свойство «OS_ACTIVITY_MODE»: «disable» ПРЕДОТВРАЩАЕТ отображение NSlog в журнале Xcode 9.

Снятие отметки с этого значения в моей схеме восстановило мои журналы.


6

Для всех, кто столкнется с этим в будущем. Причина, по которой NSLog не печатает в системный журнал в iOS 10 и iOS 11, связана с переходом Apple на унифицированное ведение журнала.

Вы можете увидеть, как WWDC обсуждает это здесь: https://developer.apple.com/videos/play/wwdc2016/721/

Документация здесь: https://developer.apple.com/documentation/os/logging.

Начиная с 10, вы должны использовать os_log вместо NSLog.

Как найти журналы на диске: https://www.blackbagtech.com/blog/2017/09/22/accessing-unified-logs-image/

Подводя итог, можно сказать, что журналы /var/db/diagnosticsдля виртуальной машины находятся по адресу/Users/USERNAME/Library/Developer/CoreSimulator/Devices/SIMULATOR-GUID/data/var/db/

Скопируйте все элементы внутри diagnosticsи uuidtextв одну папку (не включайте диагностику папок или uuidtext только то, что находится внутри).

Переименуйте эту папку foldername.xarchive.

Откройте его в Console.app или используйте утилиту OSX log:log show <path to archive> --info --predicate <options>


А как насчет iOS?
kakyo

1

Я использую Xcode 8, поэтому столкнулся с той же проблемой. И я решил эту проблему, добавив value = disableсимулятор, но на реальной машине я не добавляю ценности.


1
У меня проблемы с Xcode 9. Я вставил аргумент: OS_ACTIVITY_MODE, но он, похоже, не работает ...
Алессио Кампанелли

4
Это решение скроет весь NSLog, начиная с Xcode 9. Чтобы сохранить NSLog, замените его disableна default.
Cœur

На мой взгляд, это правильный ответ. OS_ACTIVITY_MODEс disableили defaultнапрямую
Грег

1

NSLogсообщения больше не отображаются при обновлении до Xcode 9.1 + iOS 11.1. Первоначально принятый ответ дал мне возможность обойти это с помощью приложения Console и включения Simulator ( см. Ответ Лукаса ).

В приложении «Консоль» Actionя попытался выбрать Include Debug Messagesи отменить выбор Include Info Messages(чтобы консоль не забита системными сообщениями). NSLogсообщения появлялись в окне консоли в Xcode, но не в приложении консоли.

Я понял, что должен быть более прямой способ disableвключения (т.е. default) NSLogsблагодаря комментарию Кера в ответ на этот ответ. На мой взгляд, это лучший ответ, потому что настройка OS_ACTIVITY_MODEна disableили defaultбудет иметь больше смысла для новичков.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.