How to determine whether code is running in DEBUG / RELEASE build?
IosXcodeDebuggingPreprocessorReleaseIos Problem Overview
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
Ios Solutions
Solution 1 - Ios
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.
then conditionally code for DEBUG in your source files
#ifdef DEBUG
// Something to log your sensitive data here
#else
//
#endif
Solution 2 - Ios
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:
Solution 3 - Ios
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
Solution 4 - Ios
Most answers said that how to set #ifdef DEBUG and none of them saying how to determinate debug/release build.
My opinion:
Solution 5 - Ios
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
Solution 6 - Ios
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
Solution 7 - Ios
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
Solution 8 - Ios
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.
Solution 9 - Ios
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 ?: "", "")
}
Solution 10 - Ios
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