让 IPhone 程序的调试信息只在 debug 模式下输出 转自:hager的博客

原创 2012年03月30日 12:53:30
 iPhone 应用发布后,程序运行过程中尽量不要有调试 log 信息输出,因为这样会影响程序运行的效率。通过宏定义设置,使得程序只在 debug 模式下输出这些只对于我们开发者有用的信息,而 release 时不会输出。
一、设置步骤如下:
1、首先建立一个宏定义文件,在其中加入如下代码:

//! 1、XCode 中设置控制
// Target > Get Info > Build > GCC_PREPROCESSOR_DEFINITIONS
// Configuration = Release: <empty>
//               = Debug:   DEBUG_MODE=1
//!2、人为控制
//#define DEBUG_MODE 
#ifdef DEBUG_MODE
#define DebugLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
#define DebugLog( s, ... ) 
#endif
 
2、在 Target 的 Bulid 搜索 GCC_PREPROCESSOR_DEFINITIONS(或者 preprocessor macros),没有自己创建一个
3、选择 左上角的 Configuration 的 Debug,在左下角的下拉框选择->Edit Definition at this Level ,添加 DEBUG_MODE=1
4、选择左上角的Configuration: Release,确认没有设置 DEBUG_MODE 的值

二、使用:
首先相应有调试信息的文件中包含此宏文件,使用DebugLog替代cocoa的NSLog,格式化输出的方式一样。



我们平时在开发应用的时候,经常会用到 NSLog 来调试我们的程序,而随着项目越来越大,这些用于调试的日志输出就会变得很难管理。 发布正式版的时候一定要屏蔽掉所有后台输出,因为这些输出还是比较消耗系统资源的。  往往到了这个时候,我们不得不去一行一行的找到 NSLog 调用,然后注释掉。 这样做在项目小的时候还比较有效,但随着项目规模的增长,就会变得越来越难控制。  下面就给大家介绍一个简单的方法,让我们在生成 Release 版本时不需要进行任何更改即可屏蔽所有的 Log 输出。

    首先我们先要定义这样一段预处理命令,文件名随便起,例如 CLog.h

    #ifdef DEBUG
    #define CLog(format, ...) NSLog(format, ## __VA_ARGS__)
    #else
    #define CLog(format, ...)
    #endif

    这里我们判断 DEBUG 这个宏是否定义,如果有定义我们就将这个 CLog 宏替换成 NSLog 调用,而如果没有定义过 DEBUG 标志我们就直接跳过。这点应该不难理解。

    检查 DEBUG 标志是否正确定义,Xcode 一般会在 debug 运行配置项里面已经定义号了DEBUG 标志,如果没定义我们就自己写上,以我的 Xcode 4 为例,如下图:

    找到 PreProcessor Macros 这个属性,对于 Debug 配置我们给他写上 DEBUG,而在 Release 配置中把它留空。 这样我们刚才那段预处理命令就可以根据这个标志来判断我们编译的时调试版本还是发布版本,从而控制 NSLog 的输出。 (因为 Xcode 4 会把 debug/release 两个配置项同时对比展现出来,而 3.x 版本的只能分别设置,如果你用的时xcode 3.x 开发工具, 那么就分别对 Debug/Release 都检查一下)。

    到了这里我们这个判断工作就都进行完了,不过这里还有一点比较麻烦,就是我们如果想实用 CLog 宏,就必须要导入 CLog.h 这个头文件。 不过 Xcode 为我们提供了一种非常巧妙的解决办法。 我们自己看一下项目里的文件,是不是有一个叫做 xxx-prefix.pch 的文件,只要注意到 pch 这个扩展名就可以了。 这个文件是做什么用的呢? 下面是一个 pch 文件的样本:

    //
    // Prefix header for all source files
    //
    #import <Availability.h>
    #ifndef __IPHONE_3_0
    #warning "This project uses features only available in iPhone SDK 3.0 and later."
    #endif
    #ifdef __OBJC__
        #import <UIKit/UIKit.h>
        #import <Foundation/Foundation.h>
    #endif

    这里引入了一些头文件, 其实是 Xcode 的一种预编译机制,我们在编译一个项目的时候,会有很多常用的源文件,并且这些代码文件几乎不被修改,所以 Xcode 对这些文件只在早期进行一次编译,以便我们以后的多次构建过程中反复实用。 例如这里的 UIKit 和 Foundation ,这样的机制可以加快我们每次构建项目的速度。 当然这里我们不必太深究它,知道它的作用后,我们就可以利用它来为我们的开发提供便利。 我们只需要将刚刚建立的 CLog.h 也在这里面引入一下,这样我们项目中的所有文件就都能够访问到我们刚刚定义的 CLog 宏了。 下面是完成后的 pch 文件:

    #import <Availability.h>
    #ifndef __IPHONE_3_0
    #warning "This project uses features only available in iPhone SDK 3.0 and later."
    #endif
    #ifdef __OBJC__
        #import <UIKit/UIKit.h>
        #import <Foundation/Foundation.h>
        #import "CLog.h"
    #endif

    这样,我们的 CLog 就完成了,现在可以在任何一个源文件中使用 CLog 宏来输出日志,预处理命令会自动判断当前的编译配置,如果是 Debug,就会输出日志,反之则什么都不会输出。




PS:这样我们就可以做到log调试信息在release时不会输出,同时省去了人为疏忽,发布时忘了修改调试标志!

相关文章推荐

让 IPhone 程序的调试信息只在 debug 模式下输出

from:http://blog.csdn.net/hufeng825/article/details/7410871 iPhone 应用发布后,程序运行过程中尽量不要有调试 log 信息输出,...

谈在Debug和Release模式下输出调试信息 .

在调试程序时,有时候设置断点单步运行并不能查出问题的所在,比如程序可能在运行一段时间后死掉了,或者对于Release版本运行不正常等等原因吧,这时需要通过设置一些输出信息,来帮助定位错误发生的位置,这...

谈在Debug和Release模式下输出调试信息

在调试程序时,有时候设置断点单步运行并不能查出问题的所在,比如程序可能在运行一段时间后死掉了,或者对于Release版本运行不正常等等原因吧,这时需要通过设置一些输出信息,来帮助定位错误发生的位置,这...
  • zwgdft
  • zwgdft
  • 2012年04月29日 09:53
  • 4583

Linux 程序开发打印 Debug 信息的使用技巧--C语言中几种输出调试信息的方法

Linux 程序开发打印 Debug 信息的使用技巧

易语言输出debug调试信息

  • 2014年06月13日 08:46
  • 68KB
  • 下载

Debug 输出字符串 调试信息

使用工具:VC6.0,IDA 当我们要在程序中输出调试信息时,常常以字符串的形式来输出,例如: 1.printf("Some debug information here!\n"); ...

C语言输出DEBUG调试信息的方法

问题提出我们在调试程序时,输出调试信息(又称为”打桩”或者”插桩”)是一种普遍、有效的方法。我们输出的信息通常包括行号、函数名、程序变量等。但是我们在程序BUG修复后,又会特别烦我们之间插入的哪些调试...
  • gatieme
  • gatieme
  • 2015年05月13日 10:30
  • 8343

chrome浏览器debug版本调试并且输出调试信息

1、来这里下载debug版本的flash player http://www.adobe.com/support/flashplayer/downloads.html 2、把以前的...

Debug view 调试信息查看器

  • 2012年09月08日 23:51
  • 444KB
  • 下载

程序调试信息的输出__FILE__,__LINE__,不定参数的宏定义

来源: http://blog.csdn.net/tinyhare/article/details/8484103 前言: 我们在写程序的时候,总是或多或少会加入一些printf之类的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:让 IPhone 程序的调试信息只在 debug 模式下输出 转自:hager的博客
举报原因:
原因补充:

(最多只允许输入30个字)