본문 바로가기
Unreal/Manual

Unreal C++ Assert 검증 도구 사용하기

by Dev_카페인 2023. 10. 28.
반응형

[Unreal/C++] Assert 검증 도구 사용하기

 

먼저 Assert의 국문과 영문 문서는 조금씩 달리 표현되어 있다.

DO_CHECK가 check와 ensure를 관리한다고 하지만

DO_ENSURE가 정의되어 있는 것으로 봐서 기능이 업데이트 되었을 가능성이 있다.

포인터의 NULL 여부를 검증하거나, 특정 함수에 재진입했는지 같은 검증도 가능하다.

 

런타임 중 Assert 매크로를 사용하면 3가지의 동작을 얻을 수 있다.

1. 실행 중지

2. 디버그 중 실행 중지

3. 실행을 중지하지 않고 오류만 보고

 

언리얼 공식 문서에 따르면 정의된 DO_CHECK나 DO_GUARD_SLOW의 상태에 따라 Assert가 실행된다고 한다.

DO_CHECK나 DO_GUARD_SLOW의 정의된 값은 아래 경로에서 찾아볼 수 있다.

\Engine\Source\Runtime\Core\Public\Misc\Build.h
// \Engine\Source\Runtime\Core\Public\Misc\Build.h 파일을 요약
#if UE_BUILD_DEBUG
    #define DO_GUARD_SLOW				1
    #define DO_CHECK					1
    #define DO_ENSURE					1
#elif UE_BUILD_DEVELOPMENT
    #define DO_GUARD_SLOW				0
    #define DO_CHECK					1
    #define DO_ENSURE					1
#elif UE_BUILD_TEST
    #define DO_GUARD_SLOW				0
    #define DO_CHECK					USE_CHECKS_IN_SHIPPING
    #define DO_ENSURE					USE_ENSURES_IN_SHIPPING
#elif UE_BUILD_SHIPPING
    #define DO_GUARD_SLOW				0
    #define DO_CHECK					USE_CHECKS_IN_SHIPPING
    #define DO_ENSURE					USE_ENSURES_IN_SHIPPING
#endif


DO_CHECK 가 1일 때만 실행

-  check : 결과가 false면 실행 중지

check(Expression);

-  verify : 결과가 false면 실행 중지, *DO_CHECK가 꺼져 있어도 실행

verify(Expression);

- checkf : 결과가 false면 실행 중지, 디버깅을 위한 추가 정보 기재 가능

checkf(Expression, FormattedText ....);

-  verifyf : 결과가 false면 실행 중지, 디버깅을 위한 추가 정보 기재 가능, *DO_CHECK가 꺼져 있어도 실행

verifyf(Expression, FormattedText ....);

- checkCode : ( 내용 ) 안에 있는 Code들을 체크한다, 

checkCode(
    if (!IsEverythingOK())
    {
        UE_LOG(LogUObjectGlobals, Fatal, TEXT("Something is wrong with %s! Terminating."), *GetFullName());
    }
);

-  checkNoEntry : 절대 실행될 일이 없는 코드 경로를 표시하는 데 사용된다.

실행 될 일 없는 곳에 checkNoEntry()를 넣어 놓는다. Ex) switch() { default : checkNoEntry(); break; }

-  checkNoReentry : 재귀 호출을 방지하기 위한 매크로

-  checkNoRecursion : checkNoReentry와 같은 기능을 하지만 명확한 이름을 가졌다..

재귀 호출이 일어나면 안되는 곳에 checkNoReentry(); OR checkNoRecursion(); 를 넣어 놓는다.

-  unimplemented :  특정 클래스에서 호출하면 안되거나 덮어써야 하는 함수를 표시

// You must override this
unimplemented();

 

DO_GUARD_SLOW가 1일 때만 실행

이들은 기능은 위와 같지만 검증 과정이 엄격하다. 속도가 느리기 때문에 보통 디버그 빌드에서만 사용한다.

- checkSlow : check와 기능이 같다.

- checkfSlow : checkf와 기능이 같다.

- verifySlow : verify와 기능이 같다.

DO_ENSURE 가 1일 때만 실행

이들은 검증 실패시 실행을 중지시키지 않고, 문제 추적에 도움이 되는 콜스택을 만들어 준다.

- ensure : 표현식 검증 실패 시 지점까지 이르는 콜스택을 생성한다.

if (ensure( InObject != NULL ))

- ensureMsg : 리포트에 메시지를 추가시킨 콜스택을 생성한다. (영문버전에는 없다.)

- ensureMsgf : 리포트에 메시지를 추가시킨 콜스택을 생성한다.

ensureMsg(Node != nullptr, TEXT("Node is invalid"));

- ensureAlways : ensure과 다르게 지속적으로 콜스택을 생성한다.

if (ensureAlways ( InObject != NULL ))

- ensureAlwaysMsgf : ensureMsgf  과 다르게 지속적으로 콜스택과 메시지를 생성한다.

ensureAlwaysMsgf(Node != nullptr, TEXT("Node is invalid"));
반응형