ASSERT & VERIFY & TRACE

MFC 2019. 4. 4. 09:44 Posted by 쫀다

 

ASSERT, VERIFY

사용법>

ASSERT(평가식);

VERIFY(평가식);

평가식은 TRUE, FALSE로 결정될수 있는 문장이 되어야 합니다.

 

ASSERT, VERIFY 매크로는 디버그 환경에서의 오류를 판단하는데 사용되며,  판단 결과가 0 일때, 에러 메세지를 표시해서, 프로그램내 오류가 있다는것을 통지 해줍니다. ASSERT, VERIFY로 에러메시지가 출력된 경우, 해당 프로그램은 비정상 종료(ABEND)가 됩니다.

프로그램 개발시, 디버그 모드에서 볼수있는, 「Debug Assertion Failed!」문장이 이 매크로(ASSERT, VERIFY )의 진단 결과입니다.  간혹, 개발자들 중에는 이 매크로들에 대해 좋지않은 이미지가 있을지도 모릅니다만,  하지만, 이들은 개발자에게 디버그를 돕는 고마운 매크로 라는것은 부정할수는 없습니다.

ASSERT, VERIFY가 제공하는 진단 결과는, 실행 파일, 원시 파일명, 행을 표시해 줍니다. (참고로, 진단 결과는 디버그 환경만에서만 표시됩니다.)

 

ASSERT, VERIFY 의 차이는?

ASSERT는, 디버그 환경에서만 실행되며, 릴리스 환경에서는 해당 매크로가 생략됩니다.

ex)
int a = 1;
ASSERT(a > 5);

 

VERIFY는, 빌드 환경에 좌우되지 않고 식의 평가가 이루어집니다. 예를 들어, 아래와 같이 파일을 카피하는 API의 반환값에 VERIFY를 사용했는데, 이경우, 디버그나 릴리스 환경에서 모두에서 파일의 복사는 행해집니다.

ex)

 VERIFY(CopyFile("test.txt","test2.txt",TRUE));

 

TRACE

사용법>

TRACE( "%s is %d years old", "Codein", 2); // 사용법은 printf와 흡사합니다.

 

 

DOS 시대에 프로그램을 디버깅 하기 위해서, 손쉽게  printf("test") 등을 사용하여, 문자열을 화면에 출력하였습니다. 하지만, 윈도우즈 프로그래밍 시에는 콘솔창을 띄우지 않는 경우가 많아져서, 이를 별로 이용하지 않게 되었습니다.

대신, vc++은 vc++내 출력 창에 문자열을 출력할수 있는 기능을 가지는 함수를 제공 하고 있는데, 바로 OutputDebugString()를 사용하면, VC++의 출력 윈도우에 디버그용 문자열을 출력할 수 있습니다.

 

하지만, 일반적으로, 프로그래머들은 OutputDebugString() 보다 TRACE 매크로를 많이 사용합니다. 이유는?

TRACE가 printf 처럼 서식을 설정할 수 있고, DEBUG 빌드시 밖에
동작하지 않기 때문에 사용이 편리합니다.

 

예)

int i = 1;
char sz[] = "one";
TRACE( "Integer = %d, String = %s\n", i, sz );

(참고로, TRACE 매크로도 내부적으로는 OutputDebugString를 사용하고 있습니다)


그런데, TRACE를 통한, 문자열 출력이 VC++로부터 디버그 했을 때 밖에 출력하지 않는다고 생각하는 분도 계실거 같은데요. 실은 그렇지 않습니다. 이것들은 디버거에 대해서 출력되므로, 만일 밖에 디버거가 있으면,  실행하고 있는 프로그램의 OutputDebugString()를 볼 수 있습니다. 이를 이용해서, 디버그모드로 빌드되서, 실행중인 프로그램의 OutputDebugString()를 통한 문자열 정보를 캐치해서 엿보게 하는 프로그램도 존재 합니다.

 

<출처> http://jjangss.blogspot.com/2007/02/assert-verify-trace.html