【问题标题】:How to determine whether code is running in DEBUG / RELEASE build?如何确定代码是否在 DEBUG / RELEASE 构建中运行?
【发布时间】:2012-02-22 04:50:18
【问题描述】:

我正在制作一个处理敏感信用卡数据的应用。

如果我的代码在调试模式下运行,我想将此数据记录到控制台并进行一些文件转储。

但是在最终的应用商店版本中(即在发布模式下运行时),必须禁用所有这些功能(安全隐患)!

我会尽力回答我的问题;所以问题变成了'这个解决方案是正确的还是最好的方法?'

// add `IS_DEBUG=1` to your debug build preprocessor settings  

#if( IS_DEBUG )  
#define MYLog(args...) NSLog(args)  
#else  
#define MYLog(args...)  
#endif  

【问题讨论】:

    标签: ios xcode debugging preprocessor release


    【解决方案1】:

    在“Apple LLVM - Preprocessing”、“Preprocessor Macros”下检查项目的构建设置以进行调试,以确保设置了 DEBUG - 通过选择项目并单击构建设置选项卡来执行此操作。搜索DEBUG 并查看是否确实设置了DEBUG

    但请注意。您可能会看到 DEBUG 更改为另一个变量名称,例如 DEBUG_MODE。

    然后有条件地在源文件中为 DEBUG 编码

    #ifdef DEBUG
    
    // Something to log your sensitive data here
    
    #else
    
    // 
    
    #endif
    

    【讨论】:

    • 感谢您的回答,如果我尝试这样做:#ifdef DEBUG NSLog@("Something");#else//#endif,这是行不通的。请问如何初始化按钮或将某些内容记录到控制台,您可以编辑您的问题吗?
    • 在 Swift 中呢?
    • 我可以在运行时以编程方式更改此宏吗?我想启用一个切换到生产 API 的按钮。在那个按钮上,我想将 DEBUG 更改为 0 并显示用户需要重新启动应用程序的消息。所以下次它将使用生产 API。
    【解决方案2】:

    有关 Swift 中的解决方案,请参阅 SO 上的this thread

    Swift 中的解决方案基本上是这样的:

    #if DEBUG
        println("I'm running in DEBUG mode")
    #else
        println("I'm running in a non-DEBUG mode")
    #endif
    

    此外,您需要通过-D DEBUG 条目在Swift Compiler - Custom Flags 部分为Other Swift Flags 键设置DEBUG 符号。示例请参见以下屏幕截图:

    【讨论】:

    • 在哪里可以找到 Swift 编译器 - 自定义标志?
    • @confile:我附上了一张截图,应该清楚地知道在哪里可以找到。希望对您有所帮助!
    • 请记住,这需要为使用它的特定框架/扩展定义!因此,如果您有键盘/今日扩展名,请在此处定义。如果您有其他类型的框架相同的东西。这可能只有在主要目标是客观 c...时才有必要...
    • 谢谢,看来Other Swift Flags 键不会出现,除非您选择上面的Allcombined
    • 谢谢!这就是我所缺少的。我为 Clang 而不是 Swift 设置了它。
    【解决方案3】:

    Apple 已在调试版本中包含 DEBUG 标志,因此您无需定义自己的标志。

    您可能还想考虑在不在DEBUG 模式下时将NSLog 重新定义为空操作,这样您的代码将更具可移植性,并且您可以只使用常规的NSLog 语句:

    //put this in prefix.pch
    
    #ifndef DEBUG
    #undef NSLog
    #define NSLog(args, ...)
    #endif
    

    【讨论】:

      【解决方案4】:

      大多数答案都说如何设置#ifdef DEBUG,没有人说如何确定调试/发布版本。

      我的看法:

      1. 编辑方案 -> 运行 -> 构建配置:选择调试/发布。它可以控制模拟器和你测试iPhone的代码状态。

      2. 编辑方案 -> 存档 -> 构建配置:选择调试/发布。它可以控制测试包应用程序和应用商店应用程序的代码状态。

      【讨论】:

      • 获奖答案!!!它可以帮助我确定我的问题。就我而言,我将Archive 模式保留为Debug 并将应用程序提交到应用商店。从 iTunes 下载应用程序后检查结果时,它根本不起作用。因此,请确保 DEBUG/RELEASE 仅在 Build/Run/Archive 中选择相应模式时才有效。
      【解决方案5】:

      SwiftXcode 10+

      #if DEBUG 将传入任何开发/临时构建、设备或模拟器。对于 App Store 和 TestFlight 构建,这只是错误的。

      例子:

      #if DEBUG
         print("Not App Store build")
      #else
         print("App Store build")
      #endif
      

      【讨论】:

        【解决方案6】:

        zitao xiong 的回答和我用的很接近;我还包括文件名(通过剥离 FILE 的路径)。

        #ifdef DEBUG
            #define NSLogDebug(format, ...) \
            NSLog(@"<%s:%d> %s, " format, \
            strrchr("/" __FILE__, '/') + 1, __LINE__, __PRETTY_FUNCTION__, ## __VA_ARGS__)
        #else
            #define NSLogDebug(format, ...)
        #endif
        

        【讨论】:

          【解决方案7】:

          在xcode 7中,Apple LLVM 7.0 - preprocessing下有一个字段,名为“Preprocessors Macros Not Used In Precompiled...” 我将 DEBUG 放在 Debug 前面,使用以下代码对我有用:

          #ifdef DEBUG
              NSString* const kURL = @"http://debug.com";
          #else
              NSString* const kURL = @"http://release.com";
          #endif
          

          【讨论】:

            【解决方案8】:

            只需再检测一个想法:

            DebugMode.h

            #import <Foundation/Foundation.h>
            
            @interface DebugMode: NSObject
                +(BOOL) isDebug;
            @end
            

            DebugMode.m

            #import "DebugMode.h"
            
            @implementation DebugMode
            +(BOOL) isDebug {
            #ifdef DEBUG
                return true;
            #else
                return false;
            #endif
            }
            @end
            

            添加到头桥文件中:

            #include "DebugMode.h"

            用法:

            DebugMode.isDebug()

            不需要在项目属性 swift flags 中写一些东西。

            【讨论】:

              【解决方案9】:

              为使用 Kotlin 多平台 ios 调试模式的人添加此功能。您可以通过以下方式确定构建是调试还是发布。

              if (Platform.isDebugBinary) {
                   NSLog(message ?: "", "")
              }
              

              【讨论】:

                【解决方案10】:

                不确定我是否回答了你的问题,也许你可以试试这些代码:

                #ifdef DEBUG
                #define DLOG(xx, ...)  NSLog( \
                    @"%s(%d): " \
                    xx, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__ \  
                    )
                #else
                #define DLOG(xx, ...)  ((void)0)
                #endif 
                

                【讨论】:

                • 您能否详细说明该定义的作用?它看起来很整洁,但我不太明白。 X 通常表示 Apple 保留的宏,而 PRETTY_FUNCTION 表示用户生成的东西,因此结果令人困惑
                • xx 是格式字符串,你可以使用任何你想要的,如果它与前面的字符串相同。您可以使用 FUNCTION ,但 PRETTY_FUNCTION 打印 Objective-C 方法名称。这个link解释的很好。
                猜你喜欢
                • 2017-05-10
                • 2019-11-27
                • 1970-01-01
                • 2021-06-09
                • 2018-11-29
                • 2013-12-22
                • 2017-06-14
                • 2012-06-05
                相关资源
                最近更新 更多