언리얼엔진5 공부

디버깅

Client Side 2025. 11. 17. 21:04

 Native C++

 

  • 조건부 컴파일의 활용
    • 운영체제별 / 플랫폼별 코드를 한 파일 안에 같이 작성할 수 있다.
    • 디버깅 코드 분리 가능.
    • 특정 기능을 켜거나 끄는 기능 토글 옵션을 컴파일 시점에 결정할 때 사용한다.
  • #ifdef
    • 그 뒤에 오는 매크로 이름이 정의되어 있는지 확인하는 전처리기 지시자.
    • 만약 뒤에 오는 매크로가 정의되어 있다면, 다음 조건부 컴파일 지시자 (#else, #elif) 또는 #endif 까지의 코드를 컴파일에 포함한다.
    • 만약 매크로가 정의되어 있지 않다면, 해당 코드 블록은 컴파일러가 완전히 무시한다.
    • 주석처럼 취급되는게 아니라, 애초에 없는 코드처럼 처리된다.
  • 다른 조건부 컴파일 지시자
    • #ifndef (if not defined) : 뒤에 오는 매크로가 정의되어 있지 않을 때 코드를 컴파일에 포함
    • #if : 특정 상수 표현식의 값이 참일 때 코드를 컴파일에 포함
    • #else : 이전 조건이 모두 거짓일 때 코드를 컴파일에 포함
    • #elif (else if) : 이전 조건이 거짓일 때 다른 조건을 확인하고, 그 조건이 참일 때 코드를 컴파일에 포함
  • assert() 매크로
    • 내가 만든 함수에 절대로 들어오면 안되는 값이 들어오는 것을 막기 위해 사용
    • <cassert> 헤더 파일에 정의되어 있는 매크로
    • 인자로 받은 조건식이 true 인지 false인지 확인하는 역할을 한다
    • 만약 조건 식이 거짓이라면
      • 오류 메시지 출력
        • 실패한 조건식의 텍스트
        • 파일 이름
        • 라인 번호
      • 프로그램 중단 : 현재 실행 중인 프로그램 강제 종료
      • 디버거 연결 (선택 사항) : 가능하다면 디버거를 활성화시켜서 개발자가 문제 발생 지점을 바로 확인할 수 있게 한다.
    • 릴리즈 빌드에서는 제거된다.

 

  • F9 : 토글 중단점 (Toggle BreakPoint)
    • 중단점(Break Point)을 설정하거나 해제하는 단축키.
  • F10 : 한 단계씩 프로시저 실행 (Step Over) → 함수 단위 실행
  • F11 : 한 단계씩 코드 실행 (Step Into)
    • 함수 내부의 동작이 궁금해서 직접 함수 안으로 들어가서 디버깅하고 싶을 때
  • 디버그 모드가 아닌 다른 모드인 경우에 컴파일러가 특정 코드를 최적화 시킬 수도 있다.

 

언리얼 C++

 

  • check(조건식), ensure(조건식) 구문
    • 인자로 전달한 조건식이 거짓일 경우 check() 함수는 크래시를 발생시킴.
    • ex. check(nullptr ≠ GameInstance)
    • 보통은 check() 함수를 활용해서 추가적인 디버깅 정보를 출력함.
    • ex. checkf(nullptr ≠ GameInstance, TEXT(”GameInstance is invalid”))
    • 실행 중에 클래시가 발생되면 다시 빌드해야 함.
    • 다시 빌드할 것 까진 아니고, 복구 로직을 작성해야 하는 경우를 찾고자 한다면 ensure()
    • ex. ensure(nullptr ≠ GameInstance)
    • 마찬가지로 ensureMsgf() 함수로 추가적인 디버깅 정보를 출력.
    • ex. ensureMsgf(nullptr ≠ GameInstance, TEXT(”GameInstance is invalid.”))
    • 예외처리와 checkf() 매크로 함수
      • “이건 false 일 수도 있음. 이때는 그냥 처리 안하면 됨.” → 예외처리
      • “이건 false 일 수가 없음. 이 로직을 실행하려는 사람에게 바로 알려야함.” → checkf()
  • IsValid() 함수
    • 런타임 중에 UObject 개체의 포인터가 유효한지 검사 할때 쓰는 함수.
    • 널포인터인지 아닌지만 검사하면 Pending Kill 이나 GC(Garbage Collection)의 대상인 경우를 확인 할 수 없음.
    • IsVaild() 함수를 활용하면 위 세 가지를 모두 체크해줌. 문제없다면 true 반환.

'언리얼엔진5 공부' 카테고리의 다른 글

RPC(Remote Procedure Call)  (0) 2025.11.19
ENetMode  (0) 2025.11.18
CDO (Class Default Object)  (0) 2025.11.16
UObject  (0) 2025.11.14
UHT, UBT, UAT, UBS, UMS  (1) 2025.11.13