最新消息:iOS编程开发交流群(6906921) ,Mac.Cocoa开发交流群(7758675) 欢迎iOS/macOS开发编程爱好及学习者加入!

Xcode控制台不打印NSLog

iOS 天狐 33673浏览 4评论

有个项目困扰我很久了,Xcode7运行起来之后NSLog不打印到Xcode的控制台上,而是打印在Simulator.app -> Debug ->Open System Log 中,而且还是偶发的,而且诡异的是团队中所有成员对于这个项目都有这个问题,十次有一两次能打印到Xcode控制台。甚是无语。

最近Xcode8发布了,发现Xcode8运行起来App后控制台打印出来一堆乱七八糟的Log,解决方法是

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

增加 "OS_ACTIVITY_MODE" 值为 "disable",并勾选(注意如果真机运行的时候不打印NSLog,要取消勾选),重新run即可消失。所以我想是不是和某个环境变量的设置有关。

49fbc898-072f-49dc-9311-2a36615a1446

搜索一下Apple关于NSLog的文档。我们会发现NSLog方法中调用的是NSLogv方法。Apple文档中对于NSLogv函数是这样写的Logs an error message to the Apple System Log facility(参见https://developer.apple.com/reference/foundation/1395074-nslogv?language=objc)。

这句话有两个信息我们需要重点关注下,一个就是error message,还有一个就是Apple System Log

1.NSLog工作流程

当我们写了一句NSLog的时候,他会做两件事情:

  • 把日志写到Apple System Log里面。
  • 把日志展示到Xcode的控制台上面。

一般开发的时候程序都是从Xcode中启动,所以这个时候NSLog就具有打印信息到终端的能力就像printf一样(说fprintf(stderr, ….) 更合适一点)。而且很自然也就认为NSLog只是用来打印这些调试信息用的。

但是当程序不是从Xcode或者ternimal启动等时,因为stderr不是被定向到标准终端,这个时候NSLog的功能就是把信息输入到System Log中去。如果这个时候你也用的stderr输入信息,这个时候stderr会被定向到System Log中去。

再有一个,官方Xcode 8 beta release notes写道

When debugging an app running on Simulator, logs may not be visible in the console. Workaround: Use command + / in Simulator.app to open the system log in the Console app to view NSLogs. (26457535)

意思在模拟器开启状态下,按下command + / 查看log。

虽然苹果表明NSLog不打印输出到控制台是正常情况,我在想是什么原因的,为什么我那个项目,所有人都会有个这个问题,其他项目完全没问题。说与项目无关我都说服不了我自己,有知道为什么的可以给我留言!!!!!!

临时解决办法使用printf代替NSLog

 

转载请注明:天狐博客 » Xcode控制台不打印NSLog

微信 OR 支付宝 扫描二维码
为天狐 打赏
非常感谢你的支持,哥会继续努力!
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (4)

  1. 是不是跟设置有关。隐私设置会影响这个吗?
    kkkelicheng8年前 (2016-09-20)回复
    • 就是不知道问题在哪。。惆怅
      天狐8年前 (2016-09-20)回复
      • 找到问题了吗 我也遇到了这个问题
        Vincen8年前 (2017-05-24)回复
        • 找不到啊...苹果都说了 正常...但是为什么某些项目会这样..不是很明白
          天狐8年前 (2017-05-24)回复