programing

코드가 DEBUG/릴리스 빌드에서 실행 중인지 여부를 확인하는 방법은 무엇입니까?

padding 2023. 5. 13. 09:15
반응형

코드가 DEBUG/릴리스 빌드에서 실행 중인지 여부를 확인하는 방법은 무엇입니까?

저는 민감한 신용카드 데이터를 처리하는 앱을 만들고 있습니다.

내 코드가 디버그 모드에서 실행 중이면 이 데이터를 콘솔에 기록하고 파일 덤프를 만들고 싶습니다.

그러나 최종 앱스토어 버전(즉, 릴리스 모드에서 실행 중인 경우)에서는 이 모든 것이 비활성화(보안 위험)되는 것이 필수적입니다!

저는 가능한 한 제 질문에 답하려고 노력할 것입니다. 따라서 질문은 '이 솔루션 경로가 이를 위한 올바른 방법인가 아니면 최선의 방법인가?'가 됩니다.

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

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

디버깅을 위해 'Apple LLVM - 전처리', 'Preprocessor Macros'에서 프로젝트 빌드 설정을 확인합니다.DEBUG설정 중입니다. 프로젝트를 선택하고 빌드 설정 탭을 클릭하여 이 작업을 수행합니다.검색:DEBUG그리고 정말인지 살펴보세요.DEBUG설정 중입니다.

하지만 주의를 기울이세요.DEBUG가 DEBUG_MODE와 같은 다른 변수 이름으로 변경된 것을 볼 수 있습니다.

내 프로젝트 설정의 빌드 설정 탭

그런 다음 소스 파일에서 DEBUG를 조건부로 코드화합니다.

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif

Swift의 솔루션은 SO에 있는 이 스레드를 참조하십시오.

기본적으로 Swift의 솔루션은 다음과 같습니다.

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

또한 다음을 설정해야 합니다.DEBUG의 기호.Swift Compiler - Custom Flags의 섹션Other Swift Flagsa를 통한 키-D DEBUG다음 스크린샷의 예를 참조하십시오.

여기에 이미지 설명 입력

Apple은 이미 다음을 포함합니다.DEBUG디버그 빌드의 플래그를 사용하여 사용자가 직접 정의할 필요가 없습니다.

당신은 또한 단지 정의를 재정의하는 것을 고려하는 것이 좋을 것입니다.NSLog에 없을 때 null 연산으로DEBUG모드, 그렇게 하면 코드가 더 휴대하기 쉽고 그냥 일반적으로 사용할 수 있습니다.NSLog문:

//put this in prefix.pch

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

대부분의 답변은 #ifdef DEBUG를 설정하는 방법에 대해 답했지만 디버그/릴리스 빌드를 결정하는 방법에 대해서는 언급하지 않았습니다.

내 의견:

  1. 구성표 편집 -> 실행 -> 빌드 구성 : debug / release를 선택합니다.그것은 시뮬레이터와 테스트 아이폰의 코드 상태를 제어할 수 있습니다.

  2. 구성표 편집 -> 보관 -> 빌드 구성 : 디버그 / 릴리스를 선택합니다.테스트 패키지 앱과 앱스토어 앱의 코드 상태를 제어할 수 있습니다.여기에 이미지 설명 입력

SwiftXcode 10+

#if DEBUG모든 개발/애드혹 빌드, 장치 또는 시뮬레이터를 통과합니다.앱스토어 및 TestFlight 빌드의 경우에만 잘못된 것입니다.

예:

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

Kotlin 멀티플랫폼 ios 디버그 모드로 작업하는 사용자를 위해 이것을 추가합니다.빌드가 디버그인지 릴리스인지 확인할 수 있는 방법은 다음과 같습니다.

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

zitaoxiong의 답변은 제가 사용하는 것과 거의 비슷합니다. FILE 경로를 제거하여 파일 이름도 포함합니다.

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

xcode 7에서 Apple LLVM 7.0 - 전처리 아래에 "사전 컴파일에서 사용되지 않는 전처리 매크로..."라는 필드가 있습니다.DEBUG 에 DEBUG를 붙였는데 아래 코드를 사용하면 작동합니다.

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

탐지할 아이디어가 하나 더 있습니다.

디버그 모드.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 + Xcode 14 업데이트...

Xcode 8부터는 "Other Swift Flags" 대신 "Active Compilation Conditions"를 사용해야 합니다.Xcode 9.3 기준으로 Apple은 이미 다음을 포함하고 있습니다.DEBUG프로젝트에 가치: 다음과 같습니다.

여기에 이미지 설명 입력

, 프로젝트 설정을 변경할 필요가 없으며 사용할 수 있습니다.#if DEBUG즉시:

#if DEBUG
  print("something")
#endif

그래서 저는 제 릴리스 빌드에서 코드가 실행되지 않는 이유를 알아내려고 노력하던 중에 길을 찾았고, 다른 답은 #release가 작동하는 경우를 만드는 방법을 다루지 않았습니다.

저는 DEBUG 모드에서 아무 일도 일어나지 않기를 원했기 때문에 그냥 작동할 것이라고 가정하고 (잘못된) #if RELEASE를 사용했습니다.

#if RELEASE // 여기서 특정 릴리스를 수행합니다. #endif

(적어도 XCode 14 기준) Project -> Combined -> Swift Compiler - Custom Flags (아래 스크린샷 참조)로 이동할 수 있습니다.Release 섹션에 RELEASE 값을 추가하면 #if RELEASE가 위와 같이 작동합니다.

릴리스할 때 빈 공간 옆에 있는 +를 클릭하지 않고 빈 공간을 두 번 클릭합니다.그러면 "Any Architecture / Any SDK" 줄이 추가되어 RELEASE 플래그가 제대로 작동하지 않습니다.

올바른 버전:

잘못된 버전:

제가 질문에 대답했는지 잘 모르겠습니다. 다음 코드를 사용해 보십시오.

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

언급URL : https://stackoverflow.com/questions/9063100/how-to-determine-whether-code-is-running-in-debug-release-build

반응형