ChatGPT解决这个技术问题 Extra ChatGPT

How to determine whether code is running in DEBUG / RELEASE build?

I am making an app that processes sensitive credit card data.

If my code is running in debug mode I want to log this data to the console and make some file dumps.

However on the final appstore version (ie when it is running in release mode) it is essential all of this is disabled (security hazard)!

I will try to answer my question as best I can; so the question becomes 'Is this solution path the right or best way to do it?'

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

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

n
nrudnyk

Check your project's build settings under 'Apple LLVM - Preprocessing', 'Preprocessor Macros' for debug to ensure that DEBUG is being set - do this by selecting the project and clicking on the build settings tab. Search for DEBUG and look to see if indeed DEBUG is being set.

Pay attention though. You may see DEBUG changed to another variable name such as DEBUG_MODE.

https://i.stack.imgur.com/LgTyF.png

then conditionally code for DEBUG in your source files

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif

Thanx for your answer, if i try to make like this: #ifdef DEBUG NSLog@("Something");#else//#endif, this doesn't work. How can i initialize a button or log something to the console please, can you edit your question?
What about in Swift?
can I change this macro programatically at run time? I want to enable a button that switches to production APIs. On that button, I want to change DEBUG to 0 and display the message that user needs to restart the app. So next time it will use production APIs.
C
Community

For a solution in Swift please refer to this thread on SO.

Basically the solution in Swift would look like this:

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

Additionally you will need to set the DEBUG symbol in Swift Compiler - Custom Flags section for the Other Swift Flags key via a -D DEBUG entry. See the following screenshot for an example:

https://i.stack.imgur.com/rLan3.png


Where do I find Swift Compiler - Custom Flags?
@confile: I've attached a screenshot that should make clear where to find. Hope it helps!
Remember this needs to be defined for the specific framework/extension that use it! So if you have a keyboard/today extension define it there. If you have some other kind of framework same thing. This might only be necessary if the main target is objective c...
thanks, it seems Other Swift Flags key won't appear unless you select All and combined above
Thanks! This is what I was missing. I had it set for Clang but not Swift.
N
Nick Lockwood

Apple already includes a DEBUG flag in debug builds, so you don't need to define your own.

You might also want to consider just redefining NSLog to a null operation when not in DEBUG mode, that way your code will be more portable and you can just use regular NSLog statements:

//put this in prefix.pch

#ifndef DEBUG
#undef NSLog
#define NSLog(args, ...)
#endif

Q
Qun Li

Most answers said that how to set #ifdef DEBUG and none of them saying how to determinate debug/release build.

My opinion:

Edit scheme -> run -> build configuration :choose debug / release . It can control the simulator and your test iPhone's code status. Edit scheme -> archive -> build configuration :choose debug / release . It can control the test package app and App Store app 's code status.


Awarded answer!!! it helps me to identify my problem. In my case, I had kept the Archive mode to Debug and submitted the app to the app store. When checking the result after app download from iTunes it simply does not work. So make sure that DEBUG/RELEASE only works when selected respective mode in Build/Run/Archive.
K
Kirill Kudaev

Swift and Xcode 10+

#if DEBUG will pass in ANY development/ad-hoc build, device or simulator. It's only false for App Store and TestFlight builds.

Example:

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

g
geowar

zitao xiong's answer is pretty close to what I use; I also include the file name (by stripping off the path of FILE).

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

F
Fa.Shapouri

In xcode 7, there is a field under Apple LLVM 7.0 - preprocessing, which called "Preprocessors Macros Not Used In Precompiled..." I put DEBUG in front of Debug and it works for me by using below code:

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

V
Vyacheslav

Just one more idea to detect:

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

add into header bridge file:

#include "DebugMode.h"

usage:

DebugMode.isDebug()

It is not needed to write something inside project properties swift flags.


v
vikas kumar

Adding this for people working with Kotlin multiplatform ios debug mode. Here is how you can determine if the build is debug or release.

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

P
P i

Not sure if I answered you question, maybe you could try these code:

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

Could you elaborate on exactly what that define is doing? It looks neat, but I don't quite get it. X Usually indicates an Apple reserved macro, whereas PRETTY_FUNCTION indicates something user generated, so the result is confusing
xx is format string, you can use whatever you want, if it is identical with the previous string. You can use FUNCTION , but PRETTY_FUNCTION print Objective-C method names. this link explain it very well.