언리얼 엔진/C++

언리얼엔진 Assert

mane 2021. 12. 29. 15:13
728x90
반응형

Assert

  • Assert, 어서트란 주어진 코드 조각이 가정하는 상황을 검증하는 도구입니다. 포인터의 NULL 여부를 검증하는 간단한 것에서부터, 특정 함수에 재진입했는지와 같은 복잡한 검증도 가능합니다. UE4 에는 이러한 유형의 검증을 하기 위한 매크로 시리즈가 제공됩니다. 특정 빌드 환경설정 하에서는 컴파일시 제외시킬 수 있도록 매크로로 되어 있는데, 퍼포먼스 상의 이유거나 최종 빌드에서는 필요치 않기 때문이거나 입니다. 매크로를 직접 확인하려면, 이곳에서 찾을 수 있습니다:
  • /UE4/Engine/Source/Runtime/Core/Public/Misc/AssertionMacros.h.
  • 런타임 어서트 매크로는 실행 중지, 디버그 빌드에서 실행 중지, 실행 중지하지 않고 오류 보고, 총 3 가지 카테고리에 들어갑니다. 첫째 셋째 유형은 DO_CHECK 디파인에 따라 컴파일됩니다. 둘째 유형은 DO_GUARD_SLOW 디파인을 사용하여 컴파일됩니다. 그 디파인 중 어느 하나가 0 으로 설정되면, 매크로는 비활성화되어 실행에 영향을 끼치지 않습니다.
  • 어서트 매크로의 첫 클래스를 살펴봅시다. 아래 매크로는 어서트가 true 이지 않으면 모든 실행을 중지합니다. 디버거 안에서 실행중이라면, 어떻게 해서 그 지점에 이르렀는지 조사할 수 있도록 어서트가 중단점을 발동시킵니다.

check(표현식)

표현식의 결과가 false인 경우 실행을 중지한다. 가장 간단한 형태의 매크로

check(Mesh != nullptr)
check(bInitialized);

checkf(표현식, ...)

check와 동일하지만 표현식의 결과가 false인 경우 추가정보를 출력할 수 있다.

checkf(WasDestroyed, TEXT( "Failed to destroy Actor %s (%s)"), *Actor->GetClass()->GetName(), *Actor->GetActorLabel());

verify(표현식)

DO_CHECK가 켜져있으면 check와 동일하고, DO_CHECK가 꺼져있어도 실행된다. 검증하는데 사용 된다.

verify((Mesh = GetRenderMesh()) != nullptr);

verifyf(표현식, ...)

checkf처럼 실행을 중지하면서 디버그 메시지를 출력한다.

verifyf(Module_libeay32, TEXT("Failed to load DLL %s"), *DLLToLoad);

checkCode(표현식)

중괄호 범위안의 표현식을 실행할수 있다. (checkf의 확장버전같은 느낌)
DO_CHECK가 꺼져 있으면 컴파일에서 제외된다.

checkCode( if( Object->HasAnyFlags( RF_PendingKill ) ) { UE_LOG(LogUObjectGlobals, Fatal, TEXT("Object %s is part of root set though has been marked RF_PendingKill!"), *Object->GetFullName() ); } );

checkNoEntry()

절때 실행될 일 없는 코드 경로에 표시

switch (MyEnum)
{
    case MyEnumValue:
        break;
    default:
        checkNoEntry();
        break;
}

checkNoReentry(), checkNoRecursion()

함수의 재진입을 방지하기 위한 용도

void NoReentry()
{
    checkNoReentry();
}
int32 Recurse(int32 A, int32 B)
{
    checkNoRecursion();
    return Recurse(A - 1, B - 1);
}

unimplemented()

함수내 구현이 없어서 특정 클래스에서 호출이 안되거나 오버라이딩 해야하는 함수를 표시하는데 사용

class FNoImpl
{
    virtual void DoStuff()
    {
        // You must override this
        unimplemented();
    }
};

ensure(표현식)

표현식 검증에 실패하면 콜스택을 생성

if (ensure( InObject != NULL ))
{
    InObject->Modify();
}

ensureMsg(표현식, 메시지)

ensure에 메시지를 추가한 버전

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

ensureMsgf(표현식, 메시지, ...)

checkf나 verifyf처럼 컨텍스트 정보를 포함해서 메시지를 출력할 수 있도록 함

if (ensureMsgf(!bModal, TEXT("Could not create dialog because modal is set to (%d)"), int32(bModal)))
{
    ...
}

참고

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/Assertions/

 

728x90
반응형