iOS 10不打印NSLogs

91

NSLog 在 Xcode 8.0 beta (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
9个回答

232
可能是您在方案环境变量中添加了属性“OS_ACTIVITY_MODE”:“disable”(用于隐藏模拟器的操作系统输出),然后忘记了它,现在正在运行真实设备。
在Xcode 8中:
Product -> Scheme -> Edit Scheme -> Run -> Arguments -> Environment Variables

仅添加OS_ACTIVITY_MODE并检查它(不添加值)

enter image description here

enter image description here

摘要: 这是Xcode 8 + iOS10的一个错误,我们可以通过以下方法解决:

  • 当使用模拟器时,添加名称“OS_ACTIVITY_MODE”和值“disable”,并检查它。

  • 当在真实设备上时,仅添加“OS_ACTIVITY_MODE”并检查它(不添加值)。 您将在Xcode8控制台中看到NSLog日志记录。


4
“不要增加价值”,我把它设置为“禁用”并且它可以正常工作!对我来说,空字段不能正常工作。 - m8labs
2
有没有办法自动化这个过程?我们必须记得来回这样做真的很烦人 :/ - greenhouse
只是一条注释,如果一个人太懒不想启用OS_ACTIVITY_MODE,那么dump将输出变量,而不管OS_ACTIVITY_MODE的值。 - Max MacLeod
OS_ACTIVITY_MODE设置为DEBUG_MODE可以确保日志仅在调试模式下可见。 - LazyLastBencher
2
此解决方案将在 Xcode 9 开始隐藏所有以 NSLog 开头的内容。若要保留 NSLog,请用“default”替换“disable”。 - Cœur
显示剩余7条评论

27

如果你查看Xcode 8 beta发布说明,你会发现它说:

在模拟器上调试应用程序时,日志可能无法在控制台中显示。 解决方法:在Simulator.app中使用command + / 打开系统日志,以查看NSLog。(26457535)


9
我在真实的 iOS 10 设备上也看不到 NSLog 的输出。如果你正在使用真实设备,可以打开“设备”窗口(Shift + Command + 2)并查看设备日志,但很难查看调试应用程序日志,因为控制台会显示来自系统和应用程序的所有日志。 - kientux

19

NSLog或print实际上是被执行的,但它混杂在大量其他控制台调试输出中,为解决这个问题,请打开Xcode8:

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

添加 "OS_ACTIVITY_MODE" 并将值设置为 "disable",然后检查它。

点击关闭。

xcode9

添加 "OS_ACTIVITY_MODE" 并将值设置为 "default",然后检查它。

enter image description here enter image description here


这对我不起作用。 NSLog 在已部署的应用程序中不会显示。 我使用运行在Mac 10.11上的xcode 8.1,并搭配iOS 10设备。 - mobjug
22
从Xcode 9开始,此解决方案将隐藏所有以NSLog开头的内容。要保留NSLog,请将“disable”替换为“default”。 - Cœur
3
这个答案需要更新以考虑 @Cœur 对 Xcode 9 的更正。 - Joel

8

另外,请确保控制台实际上在Xcode中可见(即,确保右侧的图标以蓝色突出显示,如下图所示)。在我升级Xcode后,它隐藏了控制台,并仅显示变量视图。这使得看起来NSLog()无法正常工作,但它确实正常工作,只是我看不到输出。

enter image description here


同时也可以使用 Shift + ⌘ + C 快捷键开启 Xcode 8.3.3 的控制台。 - DJ2
苹果的UI设计真是太棒了,充满了意义不明的图标。 - Ornithopter

7

我在真实的iOS 10设备上也看不到NSLog的输出。如果你正在使用真实设备,可以从Xcode中打开Devices窗口(Shift + Command + 2),并在那里查看设备日志,但是很难查看应用程序的日志,因为控制台显示系统和所有应用程序的日志。

(我使用的是Xcode 7,所以可能不是Xcode的问题,而是iOS 10的问题)


我在iOS 10 GM下的设备窗口中没有看到我的应用程序的NSLogs...你有同样的问题吗? - TahoeWolverine
我可以在iOS 10 GM中的Xcode 7中看到日志,不再需要打开设备窗口。 - kientux
2
我不是在谈论从Xcode运行,而是在谈论从部署的应用程序中打印的日志。 - TahoeWolverine
这个有进展了吗? - jhurray
在iOS 10设备上部署的应用程序中,NSLog和printf被省略了。您可以添加一个全局宏来将其替换为直接调用os_log - Elist

7
对于未来遇到此问题的任何人。NSLog不再打印到iOS 10和iOS 11中的系统日志是由于苹果更改为统一日志记录。您可以在此处查看有关它的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中,可在VM中找到/Users/USERNAME/Library/Developer/CoreSimulator/Devices/SIMULATOR-GUID/data/var/db/。将diagnosticsuuidtext中的所有项目复制到一个文件夹中(不包括诊断或uuidtext文件夹,只包括其中的内容)。将该文件夹重命名为foldername.xarchive。在Console.app中打开它或使用OSX工具loglog show <path to archive> --info --predicate <options>

在iOS上怎么样? - kakyo

6

嗯...看起来属性"OS_ACTIVITY_MODE":"disable"阻止了NSlog在Xcode 9日志中显示。

在我的方案中取消选中此值恢复了我的日志记录。


1
我正在使用Xcode 8,所以我也遇到了同样的问题。我通过在模拟器上添加value = disable来解决这个问题,但在真实机器上我没有添加值。

1
我在使用Xcode 9时遇到了一些问题。我插入了参数:OS_ACTIVITY_MODE,但似乎不起作用... - Alessio Campanelli
4
从Xcode 9开始,这个解决方案将隐藏所有以 NSLog 开头的内容。如需保留 NSLog,请将“disable”替换为“default”。 - Cœur
在我看来,这是正确的答案。OS_ACTIVITY_MODEdisabledefault是直接相关的。 - Greg

1

当我升级到Xcode 9.1 + iOS 11.1后,NSLog消息不再显示。最初接受的答案给了我一种方法来解决这个问题,使用控制台应用程序并启用模拟器(参见Lucas的答案)。

在控制台应用程序中,在Action下,我尝试选择Include Debug Messages并取消选择Include Info Messages(以便控制台不会被系统消息淹没)。NSLog消息出现在Xcode的控制台窗口中,但未出现在控制台应用程序中。

我意识到有一个更直接的方法可以通过Coeur对此答案的评论来禁用或启用(即默认NSLogs。在我看来,这是最好的答案,因为将OS_ACTIVITY_MODE设置为disabledefault对于初学者来说更有意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接