怎样xcode设置日志xcode8打印很多日志文字

IOS Xcode8 日志打印不全及屏蔽系统日志解决方法_IOS_第七城市
IOS Xcode8 日志打印不全及屏蔽系统日志解决方法
前言:很多小伙伴把Xcode升级到Xcode8之后会发现无缘无故打印很多系统日志并打印不全。1、屏蔽系统日志Xcode -- Product -- Scheme -- Edit Scheme -- Run -- Environment Variables 中添加&OS_ACTIVITY_MODE为disable进入快捷键:command &+ & &或 (command + shift + ,)2、打印不全//2.日志输出宏定义#ifdef DEBUG//调试状态#define MyString [NSString stringWithFormat:@&%s&, __FILE__].lastPathComponent#define MyLog(...) printf(&%s: %s 第%d行: %s/n/n&,[[IWCommon getCurrentDate] UTF8String], [MyString UTF8String] ,__LINE__, [[NSString stringWithFormat:__VA_ARGS__] UTF8String]);#else//发布状态#define MyLog(...)#endif获取当前时间#pragma mark 获取当前时间+ (NSString *)getCurrentDate{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@&YYYY-MM-dd hh:mm:ss&];
NSString *dateString = [dateFormatter stringFromDate:[NSDate date]];
return dateS}
最新教程周点击榜
微信扫一扫开发者应避免使用NSLog打印调试信息
打Log是我们debug时最简单朴素的方法,NSLog对于objc开发就像printf对于c一样重要。但在使用NSLog打印大量Log,尤其是在游戏开发时(如每一帧都打印数据),NSLog会明显的拖慢程序的运行速度(游戏帧速严重下滑)。本文探究了一下NSLog如此之慢的原因,并尝试使用lldb断点调试器替代NSLog进行debug
测试下分别使用NSLog和printf打印10000次耗费的时间。CFAbsoluteTimeGetCurrent()函数可以打印出当前的时间戳,精度还是很高的,于是乎测试代码如下:
CFAbsoluteTime startNSLog = CFAbsoluteTimeGetCurrent();
for (int i = 0; i & 10000; i++) {
NSLog(@"%d", i);
CFAbsoluteTime endNSLog = CFAbsoluteTimeGetCurrent();
CFAbsoluteTime startPrintf = CFAbsoluteTimeGetCurrent();
for (int i = 0; i & 10000; i++) {
printf("%d\n", i);
CFAbsoluteTime endPrintf = CFAbsoluteTimeGetCurrent();
NSLog(@"NSLog time: %lf, printf time: %lf", endNSLog - startNSLog, endPrintf - startPrintf);
这个时间和机器肯定有关系,只看它们的差别就好。为了全面性,尝试了三种平台:&
NSLog time: 4.985445, printf time: 0.084193 // mac
NSLog time: 5.562460, printf time: 0.019408 // 模拟器
NSLog time: 10.471490, printf time: 0.090503 // 真机调试(iphone5)
可以发现,在mac上(模拟器其实也算是mac吧)速度差别达到了60倍左右,而真机调试甚至达到了离谱的100多倍。&
基本上这种事情一定可以在Apple文档中找到,看NSLog的文档,第一句话就说:Logs
an error message to the Apple System Log
facility.,所以首先,NSLog就不是设计作为普通的debug
log的,而是error log;其次,NSLog也并非是printf的简单封装,而是Apple
System Log(后面简称ASL)的封装。&
ASL是个啥?从上,或者从终端执行man
3 asl都可以看到说明:&
大概就是个系统级别的log工具吧,syslog的替代版,提供了一系列强大的log功能。不过一般我们接触不到,NSLog就对它提供了高层次的封装,如所提到的:&
一些底层相关的守护进程(deamons)不会link如Foundation等高层框架,所以asl用在这儿正合适;而对于应用层的用NSLog。&
在CocoaLumberjack的中也说了NSLog效率低下的问题:&
意识大概是说,NSLog会向ASL写log,同时向Terminal写log,而且同时会出现在Console.app中(Mac自带软件,用NSLog打出的log在其中全部可见);不仅如此,每一次NSLog都会新建一个ASL
client并向ASL守护进程发起连接,log之后再关闭连接。所以说,当这个过程出现N次时,消耗大量资源导致程序变慢也就不奇怪了。&
时间和进程信息
主要原因已经找到,还有个值得注意的问题是NSLog每次会将当前的系统时间,进程和线程信息等作为前缀也打印出来,如:&
2012-34-56 12:34:56.789 XXXXXXXX[] xxxxxx
当然这些也可能是作为ASL的参数创建的,但不论如何,一定是有消耗的(虽然这个prefix十有八九不是我们需要的看到的)
# 如何是好
NSLog有这样的消耗问题,那该怎么办呢?
拒绝残留的Log。现在项目都是多人共同开发,我们应该只把Log作为错误日志或者重要信息的日志使用,commit前请把自己调试的log去掉(尤其是在循环里写log的小伙伴,简直不能一起快乐的玩耍了)
release版本中消除Log。debug归debug,再慢也不能波及到release版本,用预编译宏过滤下就好。
3. 是时候换个Log系统了,如CocoaLumberjack,自建一个简单的当然也挺好(其实为了项目需要自己也写了个小log系统,实现可以按名字和级别显示log和一些扩展功能,以后有机会分享下)
不过个人认为debug时最好还是用调试器进行调试(尤其是只需要知道某个变量值的时候)
# 尝试使用断点+lldb调试器打Log
关于强大的lldb调试器用一个专题来讲都是应该,现在只了解一些皮毛,不过就算皮毛的功能也可以替代NSLog这种方法进行调试了,重要的一点是:使用断点log不需要重新编译工程,况且和Xcode已经结合的很好,在此先只说打Log这件事。
## 简单断点+po(p)
断点时可以在xcode的lldb调试区使用po或p命令打印对象或变量,对于当前栈帧中引用到的变量都是可见的,所以说假如只是看一眼某个对象运行到这儿是不是存在,是什么值的话,设个断点就够了,况且IDE已经把这个功能集成,鼠标放变量上就可以了。
lldb一些常用调试技巧可以这篇
## Condition和Action断点
断点不止能把程序断住,触发时也按一定条件,而且可以执行(一个或多个)Action,在断点上右键选择Edit
Breakpoint,弹出的断点设置中可以添加一些Action:
其中专门有一项就是Log
Message,做个小测试:
for (int i = 0; i & 10; i++)
// break point here
设置断点后编辑断点:&
输入框下面就有支持的格式,表达式(或变量)可以使用@exp@这种格式包起来。于是乎输出:&
break at: 'main()',
count: 4, sunnyxx says : 3
break at: 'main()',
count: 5, sunnyxx says : 4
break at: 'main()',
count: 6, sunnyxx says : 5
正如所料。
更多的调试技巧还需要深入研究,不过可以肯定的是,比起单纯的使用NSLog,使用好的工具可以让我们debug的效率更高
NSLog耗费比较大的资源
NSLog被设计为error log,是ASL的高层封装
在项目中避免提交commit自己的Debug log,release版本更要注意去除NSLog,可以使用自建的log系统或好用的log系统来替代NSLog
debug不应只局限于log满天飞,lldb断点调试是一个优秀的debug方法,需要再深入研究下
References
文章原地址地址,
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。您所在的位置: &
iPhone开发技巧之日志保存教程
iPhone开发技巧之日志保存教程
Objective-C开发程序的时候,有专门的日志操作类NSLog,它将指定的输出到标准的错误输出上(stderr)。我们可以利用它在Xcode的日志输出窗口,或者是输出到具体的文件当中。
iPhone开发技巧之日志保存教程是本文要介绍的内容,大部分人调试程序都是看日志吧,这里我就给大家总结一下iphone程序中添加保存日志的方法。
Objective-C开发程序的时候,有专门的日志操作类NSLog,它将指定的输出到标准的错误输出上(stderr)。我们可以利用它在Xcode的日志输出窗口,或者是输出到具体的文件当中。
下面是我在程序中常用到的日志宏,用DEBUG开关管理,也就是说只有在DEBUG模式下才让日志输出 :
#ifdef&DEBUG &#&&define&LOG(fmt,&...)&do&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\ &&&&&&&&&NSString*&file&=&[[NSString&alloc]&initWithFormat:@&%s&,&__FILE__];&\ &&&&&&&&&NSLog((@&%@(%d)&&&fmt),&[file&lastPathComponent],&__LINE__,&##__VA_ARGS__);&\ &&&&&&&&&[file&release];&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\ &&&&&}&while(0) &#&&define&LOG_METHOD&NSLog(@&%s&,&__func__) &#&&define&LOG_CMETHOD&NSLog(@&%@/%@&,&NSStringFromClass([self&class]),&NSStringFromSelector(_cmd)) &#&&define&COUNT(p)&NSLog(@&%s(%d):&count&=&%d\n&,&__func__,&__LINE__,&[p&retainCount]); &#&&define&LOG_TRACE(x)&do&{printf&x;&putchar('\n');&fflush(stdout);}&while&(0) &#else &#&&define&LOG(...) &#&&define&LOG_METHOD &#&&define&LOG_CMETHOD &#&&define&COUNT(p) &#&&define&LOG_TRACE(x) &#endif&
可以看到,除了标准的用户定义输出外,我还加入了许多有用的信息,比如源程序文件位置,行号,类名,函数名等。具体的应用可以在具体的开发过程中添加、删除。
真机测试的时候,可以利用freopen将标准错误输出保存到指定的文件当中,这样就可以在问题发生后分析日志文件。
-&(void)redirectNSLogToDocumentFolder{ &&&&&NSArray&*paths&=&NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,&YES); &&&&&NSString&*documentsDirectory&=&[paths&objectAtIndex:0]; &&&&&NSString&*fileName&=[NSString&stringWithFormat:@&%@.log&,[NSDate&date]]; &&&&&NSString&*logFilePath&=&[documentsDirectory&stringByAppendingPathComponent:fileName]; &&&&&freopen([logFilePath&cStringUsingEncoding:NSASCIIStringEncoding],&a+&,stderr); &} &&-&(void)applicationDidFinishLaunching:(UIApplication&*)application&{ &&&&&//&真机测试时保存日志 &&&&&if&([CDeviceInfo&getModelType]&!=&SIMULATOR)&{ &&&&&&&&&[self&redirectNSLogToDocumentFolder]; &&&&&} &&&&&..... &}&
小结:iPhone开发技巧之日志保存教程的内容介绍完了,希望通过本文的学习能对你有所帮助!【编辑推荐】【责任编辑: TEL:(010)】
关于&&的更多文章
本书是一本与众不同的iPhone开发学习读物。作者立足实战,采用理
随着云计算、物联网、大数据、移动互联网的大发展,你应该知道这些。
BYOD(Bring Your Own Device)指携带自己的设备办公
在Android开发中,优化,是一直困扰开发者的一个难题
在百年老店诺基亚和我们依依惜别之后,上周我们又迎来
本书采用“如何解决问题”的方式阐述Ruby编程,涵盖了以下内容:Ruby术语和基本原理;数字、字符串等低级数据类型的操作;正则表
Windows Phone专家
Android开发专家
51CTO旗下网站Xcode 8打印log日志的问题小结及解决方法_网页漂亮网
您的位置: >
Xcode 8打印log日志的问题小结及解决方法
字号:[ & & & & & &
刚开运行Xcode 8.0的时候,我们可能对打印的日志有一点不耐烦,怎么打印那么多有的没的。
我们先来看下如何禁用吧,
按步骤打开Product & Scheme & Edit Scheme
选择Run & Argumens & Environment Variables ;加入OS_ACTIVITY_MODE.如下图所示
这样就不会有那些烦人的log日志。但是...这样以后iOS10真机就无法打印log日志。解决方法就会重写log日志:
其中给NSString增加了一个timeString的方法,在类别NSString+CurrentTime.h中声明这个方法。
NSString+CurrentTime.m中实现
到这里就解决了繁琐的log日志,和在iOS10真机不能打印的问题。如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网页漂亮网网站的支持!
本文移动端链接:
相关阅读:
本站已经安全运行:
创建百年品牌

我要回帖

更多关于 xcode 日志打印不全 的文章

 

随机推荐